我的方法是:找到自己設計的按鈕,在屬性-風格中選擇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 c***dlg::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控制項接收到回車就如何如何呢?
有什麼做法?
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單選按鈕
先為對話方塊加上2個radio button,分別是radio1和radio2。問題1 如何讓radio1或者radio2預設選上?如何知道哪個被選上了?關鍵是選上,預設 只要放在oninitdialog 即可。三種方法可以讓它選上 第一種 cbutton getdlgitem idc radio1...
mfc動態按鈕
動態按鈕 多個 的建立 1 在類中宣告並定義按鈕控制項的id define idc d btn 100002 在類的oninitdialog 函式中動態建立按鈕 建立按鈕物件時最好建立物件的指標 3 手動釋放物件指標 下面是動態生成多個按鈕的例子 cbutton btn new cbutton 5 ...
MFC按鈕著色
這裡也有一些 在給按鈕上色的時候出了點問題。在網上找的方法基本上都不管用。說得跟真的一樣,各種onctrlcolor 和onerasebkground 各種技術帝的方法看起來都很厲害,但是都不管用。真正有用的辦法是自定義button,才能實現按鈕顏色。但是這個辦法不免有些複雜,我這麼懶的人,既不想為...