C++ CEdit数字验证事件C++;MFC
我有一个CEdit文本框,它是属性窗格的一部分,只允许数值(正整数)。当人们输入非数值时,该框工作正常,但当他们删除框中的值时,会弹出一个对话框,说明: “请输入一个正整数。” 情况如下: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
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);
}