2011-09-01 57 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); 
}