滑动条/块响应消息WM_HSCROLL导致OnHScroll函数执行了两次的问题
滑动条/块响应拖拉操作的消息中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后面的代码只会被执行一遍。