在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.
您必须为 CEdit
和 CSliderCtrl
创建两个控件类型变量。示例:
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
更改
我在正确使用 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.
您必须为 CEdit
和 CSliderCtrl
创建两个控件类型变量。示例:
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
更改