我有一個CEdit框有一些預先填充的數字。 當用戶使用退格鍵刪除的CEdit框的內容,出現下面的警告消息框: 「請輸入一個有效的數字無效的數字包括:空格,小數,0,+, - 」CEdit刪除內容時出現警告?
我希望能夠在不顯示警告框的情況下退格CEdit框的整個內容。但是,一旦進入,我想要檢查它的值確實是一個數字。
有人可以告訴我如何做到這一點?
所有最好的 a。
我有一個CEdit框有一些預先填充的數字。 當用戶使用退格鍵刪除的CEdit框的內容,出現下面的警告消息框: 「請輸入一個有效的數字無效的數字包括:空格,小數,0,+, - 」CEdit刪除內容時出現警告?
我希望能夠在不顯示警告框的情況下退格CEdit框的整個內容。但是,一旦進入,我想要檢查它的值確實是一個數字。
有人可以告訴我如何做到這一點?
所有最好的 a。
就我個人而言,我只做過一次:我擴展了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知道。
嗨謝謝大家的幫助。 – user2859884
讀你的回覆,我想我有一個更清晰的圖片。通過將該字段定義爲整數,您將獲得內置的MFC驗證。因此,您可以嘗試像Scott建議的那樣添加DDV_例程,或者將字段類型更改爲字符串(例如CString),並通過之前提到的捕獲的消息進行自己的驗證。無論哪種方式都可以工作,但是,如果您通過自己的例程驗證字段,則會獲得更大的靈活性。
嗨,這正是我所做的,它工作得很好。感謝大家的幫助。 – user2859884
你可以發佈你現在使用的代碼嗎?有幾種方法可以處理這個問題(比如陷阱ON_EN_UPDATE),而且現在看不到你在做什麼,這很難評論。 – rrirower
嗨rrirower我沒有代碼,但我修改ON更改消息。我應該在ON_EN_UPDATE內放入什麼?我沒有專門做任何檢查。似乎MFC正在爲我做檢查(看看它是否是一個整數) – user2859884
似乎MFC增加了檢查本身,並通過MessageBox報告了情況。這很好,但是如果用戶刪除了CEdit框的內容並且得到了這個警告信息,這對用戶來說是非常煩人的。因此,我想在它出現之前攔截這個MessageBox。有人可以告訴我如何做到這一點? – user2859884