mfc按鈕名稱怎麼換行 MFC處理回車視窗消失

2021-10-16 23:17:52 字數 3413 閱讀 9061

我的方法是:找到自己設計的按鈕,在屬性-風格中選擇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,才能實現按鈕顏色。但是這個辦法不免有些複雜,我這麼懶的人,既不想為...