2009-04-13 105 views
3

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

这种情况:
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. 
} 

回答

7

您收到的消息从数据验证程序,而不是数据交换程序来。有可能是在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; 
    } 
} 
+0

但m_value仍然是20后也已被删除......所以检查是否m_value <1将返回false和m_value不会被设置为默认值。弹出错误“请输入正整数”出现在OnChange事件之前。 – Kiril 2009-04-13 14:57:31

+0

实际上在DoDataExchange中修正它甚至不会超过DDX_Text(pDX,IDC_NUMERIC_BOX,m_value),所以它甚至不会触及验证代码。 – Kiril 2009-04-13 15:00:49

0

约翰Dibling的提示使我该解决方案:


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

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

+0

这在很多情况下都适用,但通常最好在DoDataExchange()函数中进行所有数据交换和验证,因为OnEnChangeNumericBox()可能不是m_value更改的唯一地方。例如,如果您有一个将m_value更改为预设值的单选按钮。 – 2009-04-13 15:49:28

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); 
}