我试图通过覆盖OnChar和OnKeydown来阻止某些类型的字符插入到我的编辑控件中。我要挡住不止一个点。"
首先检查是否已经有一个'。,方法是将对话框类中定义的变量设置为false:
void MyMainDialog::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CWnd * eb1 = GetDlgItem(IDC_EDIT1); //Reference dimension 1 box;
CWnd * eb2 = GetDlgItem(IDC_EDIT2); //Reference dimension 2 box
CWnd * eb3 = GetDlgItem(IDC_EDIT3); //Reference dimension 3 box
CString temp;
CWnd * focusedHand = MyMainDialog::GetFocus(); //Reference edit box being focused
if(focusedHand == eb1)
{
eb1->GetWindowTextA(temp);
if(temp.Find('.') != -1)
checkPoint = true;
else
checkPoint = false;
}
else if(focusedHand == eb2)
{
eb2->GetWindowTextA(temp);
if(temp.Find('.') != -1)
checkPoint = true;
else
checkPoint = false;
}
else if(focusedHand == eb3)
{
eb3->GetWindowTextA(temp);
if(temp.Find('.') != -1)
checkPoint = true;
else
checkPoint = false;
}
CDialogEx::OnKeyDown(nChar, nRepCnt, nFlags);
}
在OnChar我检查正在键入的字符。如果它不是一个数字如果它是一个点,但已经有一个点了,那么我就不会从CDialog:
中调用OnCharvoid MyMainDialog::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if(nChar == '.' && checkPoint == false) //Is a point and there is no other point
{
CDialogEx::OnChar(nChar, nRepCnt, nFlags);
}
if((nChar < '0' || nChar > '9')) //Is not a number
{
//Show message to user
}
else //Is a number
{
CDialogEx::OnChar(nChar, nRepCnt, nFlags);
}
}
嗯,我的代码不工作。它可以编译,在编辑控件中输入时不会崩溃,但它根本不做任何事情。我想知道覆盖它的正确方法是否可以防止cdialgex::OnChar()的调用,或者如果我应该使nChar = 0以便显示的字符为空。但最重要的是,我试图在OnChar上显示的消息也没有显示,这意味着MyMainDialog::OnChar()甚至没有被调用。我应该覆盖cdialgex::OnChar()代替?
谢谢你的关注
一个更简单的方法是用OnChange事件处理你的输入:
// do not add numbers; ascci numbers is 48 - 57
if ((m_strYOURCONTROL[m_strYOURCONTROL.GetLength() - 1]) > 47 &&
m_strYOURCONTROL[m_strYOURCONTROL.GetLength() - 1]) < 58)
{
m_strYOURCONTROL = m_strYOURCONTROL.Mid(0, m_strYOURCONTROL.GetLength() - 1);
}
这将不允许数字。通过这个实现,您可以更轻松地处理编辑框
我找到了解决方案。代码似乎没有在我的应用程序中产生任何影响的原因是因为它只对MyMainDialog产生影响。当在编辑控件中输入时,OnChar()被从CEdit调用,所以这是我必须拦截的。不允许覆盖CEdit::OnChar()。解决方案是创建一个从CEdit派生的类,然后从该类拦截OnChar()。你还必须使用你的类而不是CEdit来操作你的编辑控件。
我的代码被重新表述为:
OnChar ():
void CustomEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if(nChar == '.' && checkPoint == true) //Is a point and there is already a point
{
//Show message
}
else if(nChar == '.' && checkPoint == false) //Is a point but there is no point
{
CEdit::OnChar(nChar, nRepCnt, nFlags);
}
if((nChar < '0' || nChar > '9') && nChar != 8) //Is not a number or backspace
{
//Show message
}
else //Valid
{
CEdit::OnChar(nChar, nRepCnt, nFlags);
}
}
OnKeyDown ():
void CustomEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CString temp;
this->GetWindowTextA(temp);
if(temp.Find('.') == -1)
checkPoint = false; //There is no point
else
checkPoint = true; //There is a point
CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
}
希望这对任何有类似问题的人有所帮助。顺便说一下,网上有很多课程和自动化的解决方案,我是为了学习而手工做的。
另一个解决方案是在PreTranslateMessage中更早地处理WM_CHAR
。