日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MFC处理回车窗口消失

發布時間:2023/12/2 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MFC处理回车窗口消失 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
MFC處理回車窗口消失??

2011-04-24 12:21:31|??分類: C&C++&VC |??標簽:對話框??回車??mfc??消失?? |字號?訂閱

我的方法是:找到自己設計的按鈕,在屬性-風格中選擇default button;
如果沒有自己設計的button,按照以下方法:

默認焦點在確定按鈕上,回車就觸發這個按鈕的OnOK事件,默認按回車是觸發OnOK事件,看看有沒有無效斷點; 注釋掉OnOK();或重設tab鍵順序;取消ONOK的defaultbutton屬性;

一、原因
? ? ? ? 當用戶按下Enter鍵時,Windows就會自動去找輸入焦點落在了哪一個按鈕上,當獲得焦點的按鈕的四周將被點線矩形包圍。如果所有按鈕都沒有獲得輸 入焦點,Windows就會自動去尋找程序或資源所指定的默認按鈕(默認按鈕邊框較粗)。如果對話框沒有默認按鈕,那么即使對話框中沒有OK按 鈕,OnOK函數也會自動被調用。?我把對話框上面的二個按鈕全刪掉掉,再編譯運行還是按下回車鍵會自動關閉程序啊。mfc 默認響應enter鍵的啊
二、解決辦法
? ? ? ? 為了使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);
}

1. 在VC++中如何在對話框函數中獲得edit控件的“按下回車鍵”的消息?

處理WM_KEYDOWN 消息,其中的wParam 為VK_RETURN 即是回車消息。

case WM_KEYDWON:
{
? if ( VK_RETURN == msg.wParam )
? {
??? // 按下回車
??? // 獲取焦點句柄
??? HWND hFocus = GetFocus();
??? if ( hFocus == hEdit )
??? {
?????? // 處理你的邏輯
??? }
? }
}
break;

2.我以前的做法是做一個PreTranslateMessage,在里面里感應到MSG,是回車就該怎么樣就怎么樣,呵呵,現在有個情況,在對整 個Dlg的情況下用PreTranslateMessage判斷回車不太適合,是否有可能從EDIT控件接收到回車就如何如何呢?
有什么做法?

重寫edit控件并添加 wm_keydown 和wm_char的處理函數能夠攔截普通按鍵消息,但都不能攔截回車消息。
建議你還是使用PreTranslateMessage,具體參考
http://tech.163.com/05/0906/09/1SV5EEQF00091589.html
這個寫的更簡單些
http://hi.baidu.com/albertdiao/blog/item/3183ab47d0c0182f879473bf.html

3.我的VS2008對話框程序怎么沒有PreTranslateMessage消息
用類向導生成的基于對話框的MFC程序,在屬性的message里看了。全是WM開頭的。都找了。沒找著。。。汗。。。
怎么回事?

呵呵,不是在類的message里面,而是在類的overrides里面哦…就在classview里面,不是有兩上類了嗎?點那個對話框類,在“屬性”窗口里,點“重寫”選項卡,里面列了所有可以重載的函數。

4.在我用MFC生成的對話框后,用ESC鍵就可以關閉對話框,我的程序不想要這個功能,請教各位,如何去除?
我嘗試了截取WM_CHAR和WM_KEYDONWN以及WM_SYSKEYDOWN,但都沒有觸發.

一開始的cancel按扭不要去掉,雙擊它加入命令OnCancel(),把OnCancel中調用父類去掉
直接返回,這就沒問題了 如果你已經把按鈕刪掉,那就得手工加這個命令,但效果一樣

5.你有沒有把文本編輯框屬性里的want ? return選上

//對鍵盤消息控制
BOOL ? CSetupDlg::PreTranslateMessage(MSG* ? pMsg) ?
{
if ? (pMsg-> message==UM_RETURN)
{
//讓組合框響應回車獲取文本
GetComboEditText();
}
//處理回車消息
if ? (pMsg-> message==WM_KEYDOWN ? && ? pMsg-> wParam==VK_RETURN)
{
//響應回車為tab鍵
pMsg-> wParam=VK_TAB;
}

return ? CDialog::PreTranslateMessage(pMsg);
}
ES_WANTRETURN風格只對multiple-line的Edit才有效。還是用wade_vc(我命由我不由天)的方法,在PreTranslateMessage函數中處理

總結

以上是生活随笔為你收集整理的MFC处理回车窗口消失的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。