c++ - CEdit 数字验证事件 C++ MFC

标签 c++ events mfc numeric cedit

我有一个 CEdit 文本框,它是属性 Pane 的一部分,并且只允许数值(正整数)。当人们输入非数字值时,该框工作正常,但当他们删除框中的值时,会弹出一个对话框说: “请输入一个正整数。”

情况是这样的:
1. 我在盒子里有一个数字(比如 20)。
2.我把号码删了。
3. 我收到错误对话框。
谁能告诉我如何拦截此事件并在其中放置默认值?

这是我的属性面板的样子:


const int DEFAULT_VALUE = 20;

class MyPropertyPane:public CPropertyPane
{
    //....
private:
    CEdit m_NumericBox;
    int   m_value;

    //....
public:
    afx_msg void OnEnChangeNumericBox();

    //....
}
void MyPropertyPane::MyPropertyPane()
{
   // Set a default value
   m_value = DEFAULT_VALUE;
}

//....
void MyPropertyPane::DoDataExchange(CDataExchange* pDX)
{
    DDX_Control(pDX, IDC_NUMERIC_BOX, m_NumericBox);

    // this sets the displayed value to 20
    DDX_Text(pDX, IDC_NUMERIC_BOX, m_value);
}

//....
void MyPropertyPane::OnEnChangeNumericBox()
{
    // Somebody deleted the value in the box and I got an event
    // saying that the value is changed.

    // I try to get the value from the box by updating my data
    UpdateData(TRUE);

    // m_value is still 20 although the value is 
    // deleted inside the text box.
}

最佳答案

您收到的消息来自数据验证例程,而不是数据交换例程。 DoDataExchange()中大概有这样的调用:

void MyPropertyPane::DoDataExchange(CDataExchange* pDX)
{
    DDX_Control(pDX, IDC_NUMERIC_BOX, m_NumericBox);
    DDX_Text(pDX, IDC_NUMERIC_BOX, m_value);
    DDV_MinMaxInt(pDX, m_value, 1, 20); // if the value in m_value is outside the range 1-20, MFC will pop up an error dialog
}

您可以通过删除内置的 MFC 数据验证并添加您自己的数据验证来解决此问题:

void MyPropertyPane::DoDataExchange(CDataExchange* pDX)
{
    DDX_Control(pDX, IDC_NUMERIC_BOX, m_NumericBox);
    DDX_Text(pDX, IDC_NUMERIC_BOX, m_value);

    if( m_value < 1 || m_value > 20 )
    {
        m_value = DefaultValue;
    }
}

关于c++ - CEdit 数字验证事件 C++ MFC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/744110/

相关文章:

c++ - 如何使用带代码块的 G++ 为 64 位编译?

javascript - jQuery:防止堆叠动画

c++ - 如何启动 MFC SDI 应用程序处于非事件状态?

ios - 发生 NSNotification 时如何更改 UILabel 属性

asp.net - FireFox 和 javascript 问题(event.keyCode 或 event.charCode 或 event.which 不起作用)

c++ - 将项目添加到列表控件时 UI 卡住

c++ - 重新开发 MFC 应用程序

c++ - CUDA 错误 : "dynamic initialization is not supported for __device__, __constant__ and __shared__ variables"

c++ - 如何使用 QT 和 C++ 监听 mysql 数据库中的触发事件?

c++ - 调试 Python ctypes 段错误