CEdit删除内容时出现警告?

问题描述:

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

我希望能够在不显示警告框的情况下退格CEdit框的整个内容。但是,一旦进入,我想要检查它的值确实是一个数字。

有人可以告诉我如何做到这一点?

所有最好的 a。

+0

你可以发布你现在使用的代码吗?有几种方法可以处理这个问题(比如陷阱ON_EN_UPDATE),而且现在看不到你在做什么,这很难评论。 – rrirower

+0

嗨rrirower我没有代码,但我修改ON更改消息。我应该在ON_EN_UPDATE内放入什么?我没有专门做任何检查。似乎MFC正在为我做检查(看看它是否是一个整数) – user2859884

+0

似乎MFC增加了检查本身,并通过MessageBox报告了情况。这很好,但是如果用户删除了CEdit框的内容并且得到了这个警告信息,这对用户来说是非常烦人的。因此,我想在它出现之前拦截这个MessageBox。有人可以告诉我如何做到这一点? – user2859884

就我个人而言,我只做过一次:我扩展了CEdit类,并将pretranslateMessage描述为ovverided。下面的代码:

// .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); 
} 

很明显,你必须抓住信息在你的容器类,但是这不应该是一个问题。希望这将有助于解决您的问题。 Lemme知道。

+0

嗨谢谢大家的帮助。 – user2859884

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

+0

嗨,这正是我所做的,它工作得很好。感谢大家的帮助。 – user2859884