2011-09-01 47 views
7

我在写一个基于C++ MFC对话框的应用程序,我的程序有很多滑块。我希望程序根据用户正在更改的Slider调用函数。我尝试过使用GetPos(),但目前为止没有太多成功。任何更简单的方法呢?特定滑块变化时的事件

消息映射

BEGIN_MESSAGE_MAP(CSerialPortDlg, CDialog) 
    ON_WM_SYSCOMMAND() 
    ON_WM_PAINT() 
    ON_WM_QUERYDRAGICON() 
    //}}AFX_MSG_MAP 
    //ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1) 
    ON_BN_CLICKED(IDC_READ_COMM, OnBnClickedReadComm) 
    ON_WM_CLOSE() 
    ON_BN_CLICKED(IDC_WRITE, OnBnClickedWrite) 
    //ON_CBN_SELCHANGE(IDC_SENSORS, OnCbnSelchangeSensors) 
    //ON_CBN_SELCHANGE(IDC_SENSOR_LIST, OnCbnSelchangeSensorList) 
    ON_BN_CLICKED(IDC_GO, OnGo) 
    ON_WM_TIMER() 
    ON_BN_CLICKED(IDC_KILL_TIMER, OnBnClickedKillTimer) 
    ON_BN_CLICKED(IDC_READ_TIMER, OnBnClickedReadTimer) 
    ON_BN_CLICKED(IDC_WRITE_COMM, OnBnClickedWriteComm) 
    ON_BN_CLICKED(IDC_TERMINATE, OnBnClickedTerminate) 
    ON_BN_CLICKED(IDC_RUN, OnBnClickedRun) 
    ON_CONTROL(NM_CLICK,IDC_BOOM_SLIDER, Write_Boom) 
    ON_CONTROL(NM_CLICK,IDC_PITCH_SLIDER, Write_Pitch) 
END_MESSAGE_MAP() 

...

回答

16

滑块控制的事情发送WM_HSCROLL或WM_VSCROLL通知,当他们滚动,水平或垂直。抓住他们在你的对话框中,你可以调用你想要的功能,这取决于谁发送了通知。

BEGIN_MESSAGE_MAP(CMyDlg, CDialog) 
    //... 
    ON_WM_HSCROLL() 
    //... 
END_MESSAGE_MAP() 


////////////////////////// 
// nSBCode: The operation performed on the slider 
// nPos: New position of the slider 
// pScrollBar: The scrollbar (slider ctrl in this case) that sent the notification 

void CMyDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{ 
    CSliderCtrl* pSlider = reinterpret_cast<CSliderCtrl*>(pScrollBar); 

    // Check which slider sent the notification 
    if (pSlider == &c_Slider1) 
    { 
    } 
    else if (pSlider == &c_Slider2) 
    { 
    } 

    // Check what happened 
    switch(nSBCode) 
    { 
    case TB_LINEUP: 
    case TB_LINEDOWN: 
    case TB_PAGEUP: 
    case TB_PAGEDOWN: 
    case TB_THUMBPOSITION: 
    case TB_TOP: 
    case TB_BOTTOM: 
    case TB_THUMBTRACK: 
    case TB_ENDTRACK: 
    default: 
     break; 
    } 

//... 
} 
` 
+0

非常感谢你的代码和答案。它完全符合我的代码,并根据需要得到输出。 :) 干杯。 – Neophile

+0

不客气。这是如何实现的,这很奇怪,但一旦你知道它,这很容易。 – MikMik

+0

是的,这是绝对正确的。 – Neophile

2

您要针对不同的控制不同ON_CONTROL宏的?因为它不只是一个指定不同的方法作为第三个参数ON_CONTROL

+0

见你好,我试图做这种方式,但并没有真正帮助不大。我刚刚在开头添加了ON_CONTROL位。当尝试添加事件处理程序时,滑块控件具有CUstomDraw,OutofMemory,releasedcapture和themechanged。不知道是否可以使用这些东西。 – Neophile

+1

ON_CONTROL _bit_?我不知道那一个,我正在谈论[宏](http://msdn.microsoft.com/en-us/library/7hkb8hew.aspx) – MSalters

+0

是的,我的意思是不一样的。不幸的是,它没有奏效。 – Neophile

3

我想通了,我想。你所说的滑块通常称为“滚动条”。您可能正在寻找WM_VSCROLL消息。如上所述,“lParam:如果消息是由滚动条发送的,则此参数是滚动条控件的句柄。”

CWnd::OnVScroll

+0

是的,你是绝对正确的。我添加了WM_VSCROLL函数并根据提供的其他答案进行编辑。但非常感谢您的意见。像现在的魅力一样:) – Neophile

2
BEGIN_MESSAGE_MAP(CMyDlg, CDialog) 
//... 
    ON_WM_HSCROLL() 
//... 
END_MESSAGE_MAP() 


void CMyDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{ 
    CSliderCtrl *ACSliderCtrl = (CSliderCtrl *)pScrollBar; 
    int nID = ACSliderCtrl->GetDlgCtrlID(); 
    int NewPos = ((CSliderCtrl *)pScrollBar)->GetPos(); 
    CWnd *ACWnd = GetDlgItem(nID); 


    switch (nID) 
    { 
     default: 
      break; 

     case IDC_SLIDER1: 
      m_edit1.Format("%d", NewPos); 
      UpdateData(FALSE); 
      break; 
    } 

    CDialog::OnHScroll(nSBCode, nPos, pScrollBar); 
}