MFC OnChange处理程序函数-无限循环

MFC OnChange处理程序函数-无限循环,mfc,editbox,Mfc,Editbox,(我正在使用VS++2005) 我将编辑框控件(ID-ID\u edit\u box)放在对话框上,并将(与处理程序向导)两个变量关联起来:控件(c\u editbox)和值(v\u editbox)变量。此外,我还将handler函数onechangeedit\u box与该编辑框控件相关联。假设我们可以在编辑框中只输入一个数字,该数字可以是0或1。如果我们输入其他值-我想要的是该编辑框的内容被自动清除,所以用户看不到他键入的任何内容(换句话说,用户不能在编辑框中输入除0/1以外的任何内容)。

(我正在使用VS++2005)

我将编辑框控件(ID-
ID\u edit\u box
)放在对话框上,并将(与处理程序向导)两个变量关联起来:控件(
c\u editbox
)和值(
v\u editbox
)变量。此外,我还将handler函数
onechangeedit\u box
与该编辑框控件相关联。假设我们可以在编辑框中只输入一个数字,该数字可以是0或1。如果我们输入其他值-我想要的是该编辑框的内容被自动清除,所以用户看不到他键入的任何内容(换句话说,用户不能在编辑框中输入除0/1以外的任何内容)。我在
onechangeedit_框
功能中执行该检查。代码如下:

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

这不会导致无限循环。

您可能应该通过子类化CEdit并过滤掉无效字符来实现这一点。例如:




为EditBox添加变量时,为什么不将最小/最大值设置为0/1或将值类型设置为bool

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