[MFC] 編輯框 EditControl 輸入數字范圍限制


在MFC中,項目需要對編輯框EditControl的數字輸入范圍進行限制,主要有以下實現方式,各有優缺點,個人推薦最后一個。

 

第一種:添加變量

為編輯框添加int、float變量的時候,可以填寫最大值與最小值;或者自己添加代碼DDV_MinMaxInt(pDX, m_nNum, 1, 65535);

測試發現:

只有在UpdateData(true)更新變量之后,才會對該變量的值進行判斷,並彈出對話框提醒。

但僅僅是提醒,關閉提示框之后,錯誤數據仍會顯示在編輯框上。

注意:無UpdateData(true),無判斷提示。

 

第二種:控件的EN_KillFocus事件(失去焦點事件)

當失去焦點時候,UpdateData(true),同步一下窗體和相關變量的值,這樣子系統才能正確判斷是否超過設定的范圍。

代碼如下:

void CParaConfigDlg::OnEnKillfocusReceivergain()
{
    UpdateData(true);
    if ((m_nReceiverGain<0) || (m_nReceiverGain>76))
    {
        MessageBoxA(_T("數值超過范圍!"), _T("錯誤"), MB_OK);
    }
}

有一種說法是:只要你輸入的值不在設定范圍里,那么你的焦點就不能離開控件,因為會一直彈窗提示的。

但經過我實際測試了下,發現彈框結束后焦點是離開的,這個只是在失去焦點時進行的一次判斷,超出則提示。

當然在這里我們可以進行如下更改:

void CParaConfigDlg::OnEnKillfocusReceivergain()
{
    UpdateData(true);
    if ((m_nReceiverGain<0) || (m_nReceiverGain>76))
    {
        MessageBoxA(_T("數值超過范圍!"), _T("錯誤"), MB_OK);
        (CEdit*)GetDlgItem(IDC_ReceiverGain)->SetFocus(); //設置焦點
    }
}

這樣就能保持不輸入正確格式,焦點就不能離開控件。包括關閉,取消等按鈕點擊事件。

看了別人的文章,這里可能會有一個問題:

程序用戶可能在輸入之后沒有讓編輯框失去焦點,而是直接按回車鍵進入下一步操作,那么本文上面所說的則會有問題。 

 

第三種:控件的EN_CHANGE事件(文本更改以后顯示更新事件

代碼都一樣,同上。

這里的問題是:這個事件也是在文本改變后進行判斷提示,關閉提示后,你改變其他參數,不會再次觸發,因為你沒有再改變。

即:改變一次,觸發一次。

 

第四種:控件的EN_UPDATE事件(控件即將顯示更改的文本事件)

代碼都一樣,同上。

這里的問題是:這個事件也是在文本即將顯示時進行判斷提示,關閉提示后,你改變其他參數,不會再次觸發,因為你沒有需要再顯示。

即:需要顯示一次,觸發一次。

 

第五種:自己完善的(個人推薦)

EN_KillFocus事件為例:

void CParaConfigDlg::OnEnKillfocusReceivergain()
{
    float aa = m_nReceiverGain;
    UpdateData(true);
    if ((m_nReceiverGain<0) || (m_nReceiverGain>76))
    {
        MessageBoxA(_T("數值超過范圍!"), _T("錯誤"), MB_OK);
        m_nReceiverGain = aa;
        UpdateData(false);
    }
}

主要是添加了歷史數據保存,如果數據不合法,則還原原始數據。

特別提醒下:這種方法我使用過程中發現EN_UPDATE(),EN_CHANGE()事件有些問題。

例如以EN_UPDATE()為例:數字范圍為12-76,我想輸入26,那么開始輸入2時就會報錯,導致輸入不了其他值。或者已經為26,我想改為36,也會導致6刪除不了。

EN_CHANGE事件應該也會有類似的問題,同理。自己理解下這個思想,自己進行變通就行了。

因此該方法最好使用EN_KillFocus失去焦點事件。

 

參考:http://www.cnblogs.com/ziwuge/archive/2011/11/15/2249541.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM