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

时间:2022-09-04 18:45:45

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

256人阅读 评论(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后面的代码只会被执行一遍。