Событие при изменении ползунка

Я пишу приложение на основе диалогового окна 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()

...

4 ответов


ползунок управления отправить 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;  
    }

//...  
}  
`

Я понял это, я думаю. То, что вы называете слайдером, обычно называют "полосой прокрутки". Вы, вероятно, ищете WM_VSCROLL сообщение. Как отмечалось там,"параметр lparam: если сообщение отправляется полосой прокрутки, этот параметр является дескриптором элемента управления полосы прокрутки."

см. также CWnd::OnVScroll


у вас есть другой ON_CONTROL макрос для различных элементов управления? Потому что это просто вопрос указания разных методов в качестве третьего аргумента для ON_CONTROL


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);
}