您的位置:首页 > 其它

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

2014-06-06 09:25 302 查看

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

2013-03-15 11:31
256人阅读 评论(0)
收藏
举报

滑动块 WM_HSCROLOnHScroll函数执行2次

滑动条/块响应拖拉操作的消息中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后面的代码只会被执行一遍。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐