天天看點

為什麼不應該在WM_KILLFOCUS時進行資料校驗

想法很好,但是不大對

你可能會有這樣一個好點子:當控件收到WM_KILLFOCUS消息的時候,我就執行我的控件資料校驗流程。這個想法看起來還不賴,但是時機不大對。

原因是多方面的

首先,你可能會最後才收到這個消息,對于某些應用場景來說,可能這個時間點才執行資料校驗有點太晚了。

請想象這樣一個場景:有一個對話框,上面有一個文本框和一個确認按鈕。當收到WM_KILLFOCUS消息時,文本框控件會對它的輸入内容進行有效性校驗。

假設我們的使用者輸入了一些無效的資料,在理想的情況下,使用者按下了确認按鈕,這會導緻輸入焦點從文本框上上移開,是以文本框會收到WM_KILLFOCUS消息,然後資料校驗代碼會執行,程式可以提醒使用者輸入了無效的資料。

因為滑鼠點選事件是在滑鼠按鍵釋放時才會觸發的,是以會出現這樣一種情況:使用者還沒有釋放滑鼠按鈕,無效資料的提示對話框就彈出來了,同時這個對話框會捕獲輸入焦點,而同時,因為輸入焦點已經不在按鈕上了,是以按鈕點選事件的處理代碼不會被執行。

如果考慮一種稍微不那麼理想的情況:使用者直接按下回車或者關閉按鈕對應的鍵盤快捷鍵,而不是點選确認按鈕。

鍵盤快捷鍵會被IsDialogMessage函數轉換為一個WM_COMMAND,參數為按鈕的控件ID。此時,輸入焦點并不會發生改變。是以,按鈕處理代碼會被執行,并調用EndDialog或者執行其他對應的動作。

如果對話框關閉,則輸入焦點會因為關閉事件從文本框上移走,就在此時,你的資料校驗代碼才會得到執行,但這個時候進行資料校驗,實在是太晚了,對話框已經開始關閉了。

另外,如果按鈕點選處理程式不是關閉對話框,而是開始執行其他的動作,那麼它将對使用者輸入的無效的資料進行處理,這顯然不會是你想要看到的:隻有當這個動作偶然的移動輸入焦點(例如,顯示一個進度視窗)才會使文本框控件收到一個WM_KILLFOCUS消息,這個時間點太晚了,更嚴重的是,處理程式已經對無效的資料開始進行處理了。

在輸入焦點失去時才進行資料校驗還存在另外一個可用性問題。假設使用者正在文本框中輸入資料時分心了,比如他突然想打開一封電子郵件,或者他想打開通訊錄來打一個電話,又或者他有些事情離開了座位,導緻螢幕保護程式開啟。當使用者僅僅是因為沒有輸入完整,程式就給出一個無效資料的提示,這個是使用者不樂意看到的。

那什麼時候做資料校驗?

上面我們說了你不應該在收到WM_KILLFOCUS消息時執行資料校驗,那麼,在上面時間點做資料校驗最為合适呢?

Well,當使用者完成資料輸入并希望進入下一步時就開始執行資料校驗。

對于一個簡單的對話框來說,這意味着:對使用者點選确認按鈕時執行資料校驗。

對于一個向導對話框,合适的時間點是當使用者點選下一步按鈕的時候。

對于一個标簽式對話框,則可以在使用者切換到一個新的标簽頁時進行資料校驗。

對于一些不會改變輸入焦點的提示控件是允許的,例如,當使用者輸入密碼時,如果大寫被打開了,可以彈出一個氣泡提示。這會是一個非常好的使用者體驗。

總結

最後