Mfc 删除内容时是否发出警告?

Mfc 删除内容时是否发出警告?,mfc,Mfc,我有一个CEdit盒子,里面有一些预先填充的数字。 当用户使用backspace键删除CEdit框的内容时,会出现以下警告消息框: 请输入有效数字。无效数字包括:空格、小数、0、+、- 我希望能够在不出现警告框的情况下对CEdit框的整个内容进行退格。但是,一旦输入,我希望检查该值是否确实是一个数字 有人能告诉我怎么做吗 祝你一切顺利 a、 我个人只做过一次:我扩展了CEdit类并验证了预翻译的消息。代码如下: //h #pragma一次 //切克塞特 #定义WM\u返回\u按下WM\u用户+5

我有一个CEdit盒子,里面有一些预先填充的数字。 当用户使用backspace键删除CEdit框的内容时,会出现以下警告消息框: 请输入有效数字。无效数字包括:空格、小数、0、+、-

我希望能够在不出现警告框的情况下对CEdit框的整个内容进行退格。但是,一旦输入,我希望检查该值是否确实是一个数字

有人能告诉我怎么做吗

祝你一切顺利
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);
}