CEdit数字验证事件C ++ MFC

时间:2009-04-13 14:42:12

标签: c++ events mfc numeric cedit

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

情况如下:
我的盒子里有一个数字(比如20) 我删除了号码 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.
}

3 个答案:

答案 0 :(得分:8)

您收到的消息来自数据验证例程,而不是数据交换例程。在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;
    }
}

答案 1 :(得分:0)

John Dibling的提示引导我找到这个解决方案:


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

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

答案 2 :(得分: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);
}