首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除内容时出现CEdit警告?

删除内容时出现CEdit警告?
EN

Stack Overflow用户
提问于 2013-10-22 03:06:29
回答 2查看 203关注 0票数 0

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

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

有人能告诉我怎么做吗?

万事如意;一切顺利

EN

回答 2

Stack Overflow用户

发布于 2013-10-22 20:52:05

就我个人而言,我只做过一次:我扩展了CEdit类并替换了PretranslateMessage。代码如下:

// .h

代码语言:javascript
复制
#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);
}

显然,您必须捕获容器类上的消息,但这应该不是问题。希望这将有助于解决您的问题。让我知道。

票数 0
EN

Stack Overflow用户

发布于 2013-10-22 20:52:49

读了你的回复,我想我有了一个更清晰的图景。通过将该字段定义为整数,您将获得内置的MFC验证。因此,您可以尝试添加像Scott建议的DDV_例程,或者将字段类型更改为字符串(例如,CString),并通过前面提到的陷阱消息进行您自己的验证。无论哪种方式都可以工作,但是,如果您通过自己的例程验证字段,您将获得更大的灵活性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19502660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档