对话框的MFC,一点回车就退出
對話框如何屏蔽回車鍵enter??
? 當用戶按下回車鍵時,Windows發送一個特殊的WM_GETDEFID消息來獲得缺省的命令ID,Windows再將它作為WM_COMMAND發送。所以,你要做的就是重載WM_GETDEFID消息,在有關Windows的文檔中是這樣描述WM_GETDEFID返回值的:“如果有缺省得按鈕,則返回值的高位字包含DC_HASDEFID,低位字包含控制的標識符。否則,返回值是零。” ?
? BEGIN_MESSAGE_MAP(CMyDlg, ? CDialog) ?
? ? ? ? ? ON_MESSAGE(DM_GETDEFID, ? OnGetDefID) ?
? ? ? ? ? ... ?
? END_MESSAGE_MAP() ?
? ?
? LRESULT ? CMyDlg::OnGetDefID(WPARAM ? wp, ? LPARAM ? lp) ? ?
? { ?
? ? ? ? ? return ? MAKELONG(0,DC_HASDEFID); ? ?
? }??
?????
???
??? 另外的一個比較笨的方法:添加一個按鈕,IDOK,然后刪除,??
? CDialog的OnOK虛函數控制了OK按鈕,它負責觸發數據交換以及從對話框中退出,然而,Enter鍵碰巧也具有同樣的效果。也許這是我們所需要的,也可能我們不需要這一功能,就是說不希望用戶在編輯框中按Enter鍵后出現關閉程序的情況。怎么解決這一問題? ?
? ?
? ? ? ? ? 一、原因 ?
? ?
? ? ? ? ? 當用戶按下Enter鍵時,Windows就會自動去找輸入焦點落在了哪一個按鈕上,當獲得焦點的按鈕的四周將被點線矩形包圍。如果所有按鈕都沒有獲得輸入焦點,Windows就會自動去尋找程序或資源所指定的默認按鈕(默認按鈕邊框較粗)。如果對話框沒有默認按鈕,那么即使對話框中沒有OK按鈕,OnOK函數也會自動被調用。 ?
? ?
? ? ? ? ? 二、解決辦法 ?
? ?
? ? ? ? ? 為了使Enter鍵無效,最簡單的辦法就是將CExDlg的OnOK函數寫成空函數,然后針對OK按鈕寫一個新的函數來響應。下面是具體步驟: ?
? ?
? ? ? ? ? 首先建立一個以Ex為名的基于對話框的程序。 ?
? ?
? ? ? ? ? 1.用ClassWizard映射IDOK按鈕到OnOK虛函數。 ?
? ?
? ? ? ? ? 在ClassWizard中,從CExDlg的Object ? Ids列表中選擇IDOK,然后單擊BN_CLICKED,這樣即產生了OnOK函數的原形和框架。 ?
? ?
? ? ? ? ? 2.利用對話框編輯器改變OK按鈕的ID。 ?
? ?
? ? ? ? ? 選擇OK按鈕,將它的ID由IDOK改為IDC_OK,并去掉Default ? Button屬性的復選標記。這樣OnOK函數即被分離出來。 ?
? ?
? ? ? ? ? 3.用ClassWizard創建一個OnClickedOK成員函數。 ?
? ?
? ? ? ? ? 在ClassWizard中,從CExDlg的Object ? Ids列表中選擇IDC_OK,然后單擊BN_CLICKED,函數名用OnClickedOK,產生了OnClickedOK函數的原形和框架。 ?
? ?
? ? ? ? ? 4.編輯代碼。 ?
? ?
? ? ? ? ? void ? CExDlg::OnOK() ?
? ? ? ? ? { ?
? ? ? ? ? ? ? ? ? // ? TODO: ? Add ? extra ? validation ? here ?
? ? ? ? ? ? ? ? ? // ? CDialog::OnOK(); ?
? ? ? ? ? } ?
? ?
? ? ? ? ? void ? CExDlg::OnClickedOk() ?
? ? ? ? ? { ?
? ? ? ? ? ? ? ? ? // ? TODO: ? Add ? your ? control ? notification ? handler ? code ? here ?
? ? ? ? ? ? ? ? ? CDialog::OnOK(); ?
? ? ? ? ? } ?
? ?
? ? ? ? ? 5.編譯并測試程序。 ?
? ?
? ? ? ? ? 重新編譯程序,然后測試一下Enter鍵,你會發現按下Enter鍵后將沒有任何動作,而單擊OK按鈕則仍然會和以前一樣。 ?
? ?
? ? ? ? ? 三、 ? OnCancel的處理 ?
? ?
? ? ? ? ? 正如Enter鍵可以觸發對OnOK函數的調用一樣,Esc鍵也可以觸發對OnCancel函數的調用。它將導致控制從對話框中退出。不過讀者可以像對OK按鈕一樣處理,通過設置一個無效的OnCancel函數來防止這一情況的出現 ?
? ?
? 第三個方法 ?
? BOOL ? CxxxDlg::PreTranslateMessage(MSG* ? pMsg) ?
? { ?
? ? ? ? ? // ? 修改回車鍵的操作反應 ?
? ? ? ? ? if(pMsg->message==WM_KEYDOWN ? && ? pMsg->wParam==VK_RETURN) ?
? ? ? ? ? { ?
? ? ? ? ? ? ? ? ? UINT ? nID ? = ? GetFocus()->GetDlgCtrlID(); ?
? ? ? ? ? ? ? ? ? if(ctButton ? != ? GetCtrlType(nID)) ?
? ? ? ? ? ? ? ? ? { ?
? ? ? ? ? ? ? ? ? ? ? ? ? NextDlgCtrl(); ?
? ? ? ? ? ? ? ? ? ? ? ? ? int ? nFocusID ? = ? GetFocus()->GetDlgCtrlID(); ?
? ? ? ? ? ? ? ? ? ? ? ? ? if(nFocusID ? == ? 1001) ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ((CComboBox*)(GetFocus()->GetParent()))->ShowDropDown(); ?
? ? ? ? ? ? ? ? ? ? ? ? ? else ? if(ctComboBox ? == ? GetCtrlType(nFocusID)) ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ((CComboBox*)GetFocus())->ShowDropDown(); ?
? ?
? ? ? ? ? ? ? ? ? ? ? ? ? return ? TRUE; ?
? ? ? ? ? ? ? ? ? } ?
? ? ? ? ? } ?
? ? ? ? ? return ? CDialog::PreTranslateMessage(pMsg);??
? }??
總結
以上是生活随笔為你收集整理的对话框的MFC,一点回车就退出的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BCB6.0下安装Indy9
- 下一篇: Windbg+VirtualBox调用内