Mfc 删除内容时是否发出警告?
我有一个CEdit盒子,里面有一些预先填充的数字。 当用户使用backspace键删除CEdit框的内容时,会出现以下警告消息框: 请输入有效数字。无效数字包括:空格、小数、0、+、- 我希望能够在不出现警告框的情况下对CEdit框的整个内容进行退格。但是,一旦输入,我希望检查该值是否确实是一个数字 有人能告诉我怎么做吗 祝你一切顺利Mfc 删除内容时是否发出警告?,mfc,Mfc,我有一个CEdit盒子,里面有一些预先填充的数字。 当用户使用backspace键删除CEdit框的内容时,会出现以下警告消息框: 请输入有效数字。无效数字包括:空格、小数、0、+、- 我希望能够在不出现警告框的情况下对CEdit框的整个内容进行退格。但是,一旦输入,我希望检查该值是否确实是一个数字 有人能告诉我怎么做吗 祝你一切顺利 a、 我个人只做过一次:我扩展了CEdit类并验证了预翻译的消息。代码如下: //h #pragma一次 //切克塞特 #定义WM\u返回\u按下WM\u用户+5
a、 我个人只做过一次:我扩展了CEdit类并验证了预翻译的消息。代码如下: //h
#pragma一次
//切克塞特
#定义WM\u返回\u按下WM\u用户+5
#定义WM_编号\u插入的WM_用户+6
类CHexEdit:公共CEdit
{
声明动态(CHexEdit)
公众:
CHexEdit();
虚拟~CHexEdit();
受保护的:
声明消息映射()
公众:
afx_msg void OnKeyUp(单位nChar、单位nRepCnt、单位nFlags);
虚拟BOOL预翻译消息(MSG*pMsg);
};
//.cpp
#包括“stdafx.h”
#包括“HexEdit.h”
#包括“Utils.h”
//切克塞特
实现动态(CHexEdit、CEdit)
CHexEdit::CHexEdit()
{
}
CHexEdit::~CHexEdit()
{
}
开始消息映射(CHexEdit、CEdit)
关于\u WM\u KEYUP()
结束消息映射()
//CHexEdit消息处理程序
BOOL CHexEdit::预翻译消息(MSG*pMsg)
{
布尔巴克哈斯;
布尔b09Chars;
布尔-巴利丁普特;
boolbcontrolchars;
布尔博克;
如果(pMsg->消息==WM\U键控)
{
bAFChars=pMsg->wParam>='A'&&pMsg->wParam wParam>='A'&&pMsg->wParam wParam>='0'&&pMsg->wParam wParam>=0x08&&pMsg->wParam wParam>=0x5B&&pMsg->wParam wParam>=VK_NUMPAD0&&pMsg->wParam PostMessage*/
打破
违约:
GetParent()->PostMessage(插入的WM_编号,16);
打破
}
CEdit::OnKeyUp(nChar、nRepCnt、nFlags);
}
显然,您必须捕获容器类上的消息,但这应该不是问题。希望这将有助于解决您的问题。让我知道。阅读您的回复,我想我的情况更清楚了。通过将字段定义为整数,您将获得内置的MFC验证。因此,您可以尝试添加Scott建议的DDV_uu例程,或者将字段类型更改为字符串(例如CString),并通过前面提到的捕获消息进行自己的验证。但是,无论哪种方法都可以,如果您通过自己的例程验证字段,您将获得更大的灵活性。您可以发布您现在使用的代码吗?有几种方法可以处理此问题(例如,在更新时被捕获),在看不到您现在正在做什么的情况下,很难对其进行评论。嗨,rrirower,我没有代码,但我确实修改了更改消息。我应该在ON_EN_更新中添加什么内容?我没有具体做任何检查。看起来MFC正在为我做检查(看看它是否是一个整数)。看起来MFC添加了检查本身,并通过MessageBox报告了条件。这很好,但是如果用户删除CEdit框的内容并收到此警告消息,则会非常烦人。因此,我想在MessageBox出现之前拦截它。有人能告诉我怎么做吗?在DoDataExchange函数中有没有对DDV_xxxx函数的调用?这些调用是可选的,可能会生成笨拙的消息框。您可以通过删除DDV_uu调用并自己进行数据验证来做得更好。你好,ScottMcP MVP,我恐怕没有任何DDV_u调用(我有DDX_u调用)。你能告诉我数据在哪里得到验证吗?(这开始让我感到沮丧)。嗨,谢谢你们的帮助。嗨,这正是我所做的,而且效果很好。谢谢大家的帮助。
#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);
}