(我正在使用VS ++ 2005)
我将编辑框控件(带有ID - ID_edit_box
)放在我的对话框上,并将(与处理程序向导)关联起来两个变量:control(c_editbox
)和value(v_editbox
)变量。我还将处理函数OnEnChangeedit_box
与该编辑框控件相关联。假设我们可以在编辑框中输入一个数字,并且该数字可以是0或1.如果我们输入其他值 - 我想要的是该编辑框的内容被自动清除,因此用户无法看到他输入任何内容(换句话说,用户不能在编辑框中输入除0/1之外的任何内容)。我这样检查onEnChangeedit_box
函数。这是代码:
void CSDRDlg::OnEnChangeedit_box()
{
CWnd* pWnd;
CString edit_box_temp;
pWnd = GetDlgItem(ID_edit_box);
pWnd->GetWindowText(edit_box_temp);
if ((edit_box_temp == "0" || edit_box_temp == "1")
{...do something - i.e. setfocus on some other edit box }
else
{
pWnd->SetWindowText(""); // clear the content of edit box
//... any other statement below will not be executed because the
//above line cause again call of this function
}
}
我调试并发现该行:pWnd->SetWindowText("");
导致无限循环,因为我们更改了此函数中的控制内容,这再次触发了她的调用。
但是我改变了上面这样的代码:
void CSDRDlg::OnEnChangeedit_box()
{
UpdateData(TRUE);
if ((v_editbox == "0" || v_editbox== "1")
{...do something - i.e. setfocus on some other edit box }
else
{
v_editbox = "";
UpdateData(FALSE);
}
}
这是我想要的,但有人可以解释为什么我们打电话
v_editbox = "";
UpdateData(FALSE);
不会导致无限循环。
答案 0 :(得分:1)
为EditBox添加变量时,为什么不将Min / Max值设置为0/1或将值设置为bool
答案 1 :(得分:0)
您应该通过继承CEdit并过滤掉无效字符来完成此操作。例如:
class CSDREdit public CEdit
{
afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(CSDREdit, CEdit)
ON_WM_CHAR()
END_MESSAGE_MAP()
void CSDREdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if (nChar != _T('0') && nChar != _T('1'))
return;
CEdit::OnChar(nChar, nRepCnt, nFlags);
}