C++ CEdit数字验证事件C++;MFC

C++ CEdit数字验证事件C++;MFC,c++,events,mfc,numeric,cedit,C++,Events,Mfc,Numeric,Cedit,我有一个CEdit文本框,它是属性窗格的一部分,只允许数值(正整数)。当人们输入非数值时,该框工作正常,但当他们删除框中的值时,会弹出一个对话框,说明: “请输入一个正整数。” 情况如下: 1.我的盒子里有一个号码(比如说20)。 2.我删除了号码。 3.我得到错误对话框。 有人能告诉我如何截取这个事件并在其中输入默认值吗 以下是我的属性窗格的外观: const int DEFAULT_VALUE = 20; class MyPropertyPane:public CPropertyPane

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

情况如下:
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()中可能有类似的调用:

您可以通过删除内置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;
    }
}
void MyPropertyPane::DoDataExchange(CDATA交换*pDX)
{
DDX_控制(pDX、IDC_数字盒、m_数字盒);
DDX_文本(pDX、IDC_数字框、m_值);
如果(m|u值<1 | m|u值>20)
{
m_值=默认值;
}
}

约翰·迪柏林的提示让我想到了这个解决方案:


void MyPropertyPane::OnEnChangeNumericBox()
{
    UpdateData(TRUE);
    CString value;
    m_NumericBox.GetWindowText(value);
    if( value.IsEmpty() )
    {
        m_value = DEFAULT_VALUE;
        UpdateData(FALSE);
    }
}

我真正需要做的唯一验证就是检查该框是否包含值,因为实际的数字验证已经由该框处理。用户不能输入非数字值,但他们可以删除现有值,因此在数据交换功能中很难处理这种情况,我不得不“破解”OnChange事件。

这一项对我有效。

void CtimersDlg::OnEnChangeInterval()
{
   CString value; //or use char *
   CWnd *pWnd = GetDlgItem(IDC_INTERVAL);//IDC_EDITBOX

   if(pWnd)
   {
      pWnd->GetWindowTextW(value);
   }

   int i = _wtoi(value); //if char * use _atol()
   if((!value.IsEmpty())&& (i))  //To check i = 0 or 00 entered or not
      UpdateData(TRUE);
}

但是m_值在被删除后仍然是20。。。因此,检查m_值是否小于1将返回false,并且m_值不会设置为默认值。弹出错误“请输入正整数”出现在OnChange事件之前。实际更正。。在DoDataExchange中,它甚至无法通过DDX_文本(pDX、IDC_数值框、m_值),因此它甚至不会命中验证代码。这在许多情况下都有效,但通常最好在DoDataExchange()函数中进行所有数据交换和验证,因为OneChangeNumericBox()可能不是唯一更改m_值的地方。例如,如果您有一个将m_值更改为预设值的单选按钮。好的一点是,通常DoDataExchange()函数可能是执行验证的最佳位置。。。我的例子有点例外。用户如何输入0?
void CtimersDlg::OnEnChangeInterval()
{
   CString value; //or use char *
   CWnd *pWnd = GetDlgItem(IDC_INTERVAL);//IDC_EDITBOX

   if(pWnd)
   {
      pWnd->GetWindowTextW(value);
   }

   int i = _wtoi(value); //if char * use _atol()
   if((!value.IsEmpty())&& (i))  //To check i = 0 or 00 entered or not
      UpdateData(TRUE);
}