【问题标题】:Event when a particular Slider is changed更改特定 Slider 时的事件
【发布时间】:2011-11-08 08:22:41
【问题描述】:

我正在编写一个基于 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()

...

【问题讨论】:

    标签: visual-c++ mfc


    【解决方案1】:

    您对不同的控件有不同的ON_CONTROL 宏吗?因为这只是将不同的方法指定为ON_CONTROL 的第三个参数的问题

    【讨论】:

    • 您好,我尝试过这样做,但并没有太大帮助。我刚刚在开头添加了 ON_CONTROL 位。在尝试添加事件处理程序时,滑块控件具有 CUstomDraw、OutofMemory、releasedcapture 和 themechanged。不确定这些是否可以使用。
    • ON_CONTROL ?那个我不知道,我说的是the macro
    • 是的,我的意思不是一点点。不幸的是,它不起作用。
    • 那么请向我们展示您的消息图(有足够的上下文)。
    【解决方案2】:

    滑块控件在水平或垂直滚动​​时发送 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;  
        }
    
    //...  
    }  
    `
    

    【讨论】:

    • 非常感谢您的代码和回答。它非常适合我的代码并根据需要获得输出。 :) 干杯。
    • 不客气。这是如何实现的,这很奇怪,但是一旦你知道它就很容易了。
    • 是的,这绝对是真的。
    【解决方案3】:

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

    另见CWnd::OnVScroll

    【讨论】:

    • 是的,你完全正确。我添加了 WM_VSCROLL 函数并根据提供的其他答案对其进行了编辑。但真的非常感谢您的意见。现在像魅力一样工作:)
    【解决方案4】:
    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);
    }
    

    【讨论】:

      猜你喜欢
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-28
      • 1970-01-01
      相关资源
      最近更新 更多