滑动条/块响应消息WM_HSCROLL导致OnHScroll函数执行了两次的问题

论坛 期权论坛 脚本     
匿名技术用户   2020-12-30 21:20   160   0

滑动条/块响应拖拉操作的消息中WM_HSCROLL,在OnHScroll函数中进行调试,发现点击箭头时,OnHScroll函数执行了两次。这是因为点击箭头时nSBCode会被赋值两次,一个SB_PAGELEFT(右箭头就是right),完了之后SB_ENDSCROLL也会发出,所以你onHSCroll里的内容会被履行两次,解决方法是在onHSCroll函数内建立一个switch处理nSBCode,且功能代码放在各case下,就算是同样的代码也要复制即便放在case中,如果放在switch外又会被执行两遍。下面举例来说明一个可行的其他解决办法:

void CSNUBBERDlg::OnHScroll(UINTnSBCode, UINT nPos, CScrollBar* pScrollBar)

{

// TODO: Add your message handler code here and/or calldefault

CDialogEx::OnHScroll(nSBCode,nPos, pScrollBar);

int nID = pScrollBar->GetDlgCtrlID(); //获取滑动块ID

if (nID == IDC_SCROLLBAR1)

{ switch(nSBCode) // 按是哪一种操作进行处理

{ case SB_LINELEFT: m_vset1-=5; //点击左箭头

break;

case SB_LINERIGHT: m_vset1+=5; //点击右箭头

break;

caseSB_THUMBPOSITION: //拖动滑动块(不允许拖动)

break;

caseSB_ENDSCROLL: return;

}

if(m_vset1<0) m_vset1 = 0;

if(m_vset1>500)m_vset1 = 500;

m_scrollbar1.SetScrollPos(m_vset1);

CString str;

str.Format(_T("%d"),m_vset1);

GetDlgItem(IDC_EDIT_NUM1)->SetWindowText(str);

if(!m_bSerialPortOpened[1])return;

SendData(m_vset1,1);

}

}

本例中不加“caseSB_ENDSCROLL: return;”的话,switch后面的代码会被执行两遍,

加上“caseSB_ENDSCROLL: return;”的话,switch后面的代码只会被执行一遍。
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP