2013-10-21 111 views
0

我有一個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

回答

0

就我個人而言,我只做過一次:我擴展了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

0

讀你的回覆,我想我有一個更清晰的圖片。通過將該字段定義爲整數,您將獲得內置的MFC驗證。因此,您可以嘗試像Scott建議的那樣添加DDV_例程,或者將字段類型更改爲字符串(例如CString),並通過之前提到的捕獲的消息進行自己的驗證。無論哪種方式都可以工作,但是,如果您通過自己的例程驗證字段,則會獲得更大的靈活性。

+0

嗨,這正是我所做的,它工作得很好。感謝大家的幫助。 – user2859884