在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