在MFC中用编辑框处理滑块控件

Handle the Sliders Control with Edit Box in MFC

我在正确使用 Slider Control 和很好地理解值的 UpdatingData 机制方面遇到问题。 这是一个非常简单的程序,应该可以帮助我理解问题。

看看我的代码:

// TestDialog.cpp : implementation file
//

#include "stdafx.h"
#include "ControlsandVariables.h"
#include "TestDialog.h"
#include "afxdialogex.h"


// TestDialog dialog

IMPLEMENT_DYNAMIC(TestDialog, CDialog)

TestDialog::TestDialog(CWnd* pParent /*=NULL*/)
    : CDialog(TestDialog::IDD, pParent)
    , editbox_value(0)
    , slider_value(0)
{

}

TestDialog::~TestDialog()
{
}

void TestDialog::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_SLIDER1, slider_ctrl);
    DDX_Text(pDX, IDC_EDIT1, editbox_value);
    DDV_MinMaxInt(pDX, editbox_value, 0, 99);
    DDX_Slider(pDX, IDC_SLIDER1, slider_value);
}


BEGIN_MESSAGE_MAP(TestDialog, CDialog)
    ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER1, &TestDialog::OnNMCustomdrawSlider1)
    ON_EN_CHANGE(IDC_EDIT1, &TestDialog::OnEnChangeEdit1)
END_MESSAGE_MAP()


// TestDialog message handlers


void TestDialog::OnNMCustomdrawSlider1(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
    // TODO: Add your control notification handler code here
    
    int value = slider_ctrl.GetPos();
    editbox_value = value;
    UpdateData(TRUE);
    
    //editbox_value = slider_value;
    //UpdateData(TRUE);
    *pResult = 0;
}

我在同时更改滑块和编辑框上的值时遇到问题。 如果我使用 UpadateData(TRUE),滑块的值会改变,但编辑框保持不变。
另一方面,如果我设置 UpdateData (FALSE) 滑块保持不变,但编辑框值正在改变并且在迭代后返回到 0。 如何实现slider和editbox相互依赖改变值的状态。 我想提一下,这是一个 WindowsEmbedded 2013 版本的 MFC 库,不适用于本地 Windows.

您必须为 CEditCSliderCtrl 创建两个控件类型变量。示例:

  • m_cedit
  • m_slider

备注:

  • CSliderCtrl 发送 WM_HSCROLL 消息
  • 确保 CEdit Number 属性 设置为 True

将以下函数添加到 Dlg header class:

afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
afx_msg void OnEnChangeEdit();

在 CPP 中:

BEGIN_MESSAGE_MAP(CMFCSpinerDlg, CDialogEx)
    ON_WM_HSCROLL() // Called when Slider is scrolled
    ON_EN_CHANGE(IDC_EDIT1, OnEnChangeEdit) // Called when CEdit change value
END_MESSAGE_MAP()


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

    // You can have multiple sliders: Check which one sent the notification  
    if (pSlider == &m_slider)
    {
        CString strSliderValue;
        int iValue = m_slider.GetPos(); // Get Slider value
        strSliderValue.Format("%d", iValue); 

        m_cedit.SetWindowText(strSliderValue); // Change CEdit Value
    }
}

void CMFCSpinerDlg::OnEnChangeEdit()
{
    CString strEditValue;
    m_cedit.GetWindowText(strEditValue);
    int iCeditValue = atoi(strEditValue);
    
    // do other check on value ...
    m_slider.SetPos(iCeditValue); // set Slider value
}

通过这样做:

  • 如果更改 CSliderCtrl 值 -> CEdit 更改
  • 如果更改 CEdit 值 -> CSliderCtrl 更改