2011-09-01 50 views
7

私はC++のMFCダイアログベースのアプリケーションを作成しており、プログラムには多くのスライダがあります。どのスライダーがユーザーによって変更されているかに応じて、プログラムが関数を呼び出すようにします。私は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); 
} 
関連する問題