我有一个 CEdit 框,其中包含一些预先填充的数字。当用户使用退格键删除 CEdit 框的内容时,会出现以下警告消息框:“请输入有效数字。无效数字包括:空格、小数、0、+、-”
我希望能够在不出现警告框的情况下退格 CEdit 框的全部内容。但是,一旦输入,我想检查该值是否确实是一个数字。
有人可以告诉我该怎么做吗?
万事如意。
我有一个 CEdit 框,其中包含一些预先填充的数字。当用户使用退格键删除 CEdit 框的内容时,会出现以下警告消息框:“请输入有效数字。无效数字包括:空格、小数、0、+、-”
我希望能够在不出现警告框的情况下退格 CEdit 框的全部内容。但是,一旦输入,我想检查该值是否确实是一个数字。
有人可以告诉我该怎么做吗?
万事如意。
我个人只做了一次:我扩展了 CEdit 类并覆盖了 PretranslateMessage。这是代码:
// 。H
#pragma once
// CHexEdit
#define WM_RETURN_PRESSED WM_USER + 5
#define WM_NUMBER_INSERTED WM_USER + 6
class CHexEdit : public CEdit
{
DECLARE_DYNAMIC( CHexEdit )
public:
CHexEdit();
virtual ~CHexEdit();
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnKeyUp( UINT nChar, UINT nRepCnt, UINT nFlags );
virtual BOOL PreTranslateMessage( MSG* pMsg );
};
// .cpp
#include "stdafx.h"
#include "HexEdit.h"
#include "Utils.h"
// CHexEdit
IMPLEMENT_DYNAMIC( CHexEdit, CEdit )
CHexEdit::CHexEdit()
{
}
CHexEdit::~CHexEdit()
{
}
BEGIN_MESSAGE_MAP( CHexEdit, CEdit )
ON_WM_KEYUP()
END_MESSAGE_MAP()
// CHexEdit message handlers
BOOL CHexEdit::PreTranslateMessage( MSG* pMsg )
{
bool bAFChars;
bool b09Chars;
bool bValidInput;
bool bControlChars;
BOOL bOK;
if ( pMsg->message == WM_KEYDOWN )
{
bAFChars = pMsg->wParam >= 'A' && pMsg->wParam <= 'F';
bAFChars |= pMsg->wParam >= 'a' && pMsg->wParam <= 'f';
b09Chars = pMsg->wParam >= '0' && pMsg->wParam <= '9';
bValidInput = bAFChars || b09Chars;
bControlChars = pMsg->wParam >= 0x08 && pMsg->wParam <= 0x2F;
bControlChars = bControlChars || ( pMsg->wParam >= 0x5B && pMsg->wParam <= 0x5F );
bControlChars = bControlChars || ( pMsg->wParam >= VK_NUMPAD0 && pMsg->wParam <= VK_NUMPAD9 );
if ( bValidInput || bControlChars )
{
bOK = TRUE;
}
else
{
bOK = FALSE;
}
if ( !bOK ) return TRUE; // Non fare la pre-translate.
}
return CEdit::PreTranslateMessage(pMsg);
}
void CHexEdit::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CString strValue;
switch( nChar )
{
case VK_RETURN:
/*GetParent()->PostMessage( WM_RETURN_PRESSED, 0, ( LPARAM )byNewValue );*/
break;
default:
GetParent()->PostMessage( WM_NUMBER_INSERTED, 16 );
break;
}
CEdit::OnKeyUp(nChar, nRepCnt, nFlags);
}
显然你必须在你的容器类上捕捉到消息,但这应该不是问题。希望这将有助于解决您的问题。让我知道。
看了你的回复,我想我有一个更清晰的画面。通过将字段定义为整数,您将获得内置的 MFC 验证。因此,您可以尝试像 Scott 建议的那样添加 DDV_ 例程,或者将字段类型更改为字符串(例如 CString)并通过前面提到的捕获消息进行自己的验证。无论哪种方式都应该有效,但是,如果您通过自己的例程验证该字段,您将获得更大的灵活性。