模式對話方塊非模式對話方塊新增工具欄 選單 狀態列總結

2021-06-26 06:21:28 字數 1923 閱讀 7580

要使選單、工具欄按鈕響應同乙個事件只需要將兩者id號設定為相同即可;我在這裡主要說明怎樣使兩者的on_update_command_ui命令得到一致的響應:

(1)無論是模態對話方塊還是非模態對話方塊,要更新選單與工具按鈕的狀態,即添on_update_command_ui訊息響應。但是,結果出乎我們意料,對話並沒有任何響應:

從命令使用者介面處理函式(command ui handler)改變選單狀態(啟用/禁用,選擇/取消選擇,更改文字)在由對話方塊處理時沒有正常工作。

void ctestdlg::onupdate**********(ccmdui*pcmdui)

原因:

下拉列表顯示的時候, wm_initmenupopup訊息被先傳送以顯示選單項

mfc cframewnd::oninitmenupopup函式遍歷選單項並為每個選單項呼叫更新命令處理函式(如果有的話),

.選單的外觀被更新以反映它的狀態(啟用/禁用

,選擇/取消選擇),

更新使用者介面機制在基於對話方塊的應用程式中不能工作,因為

cdialog

沒有oninitmenupopup

處理函式,而使用

cwnd's

預設處理函式

,該函式沒有為選單項呼叫更新命令處理函式。

解決辦法:新增該函式。可以使用類嚮導來新增(即:專案->類嚮導->類名選」c***dlg」->訊息裡搜」 wm_initmenupopup」->新增)如果訊息裡沒有該訊息,可以使用類嚮導類的」新增自定義訊息」進行新增或進行手動新增。

具體細節見:

在此主要補充中所說在非模態對話方塊中的不同。

對於非模態對話方塊,它沒有自己單獨的訊息迴圈,工具條總是無法響應on_update_command_ui訊息;所以我的解決

辦法是:

在工具按鈕對應的訊息響應函式彙總手動新增更改工具按鈕狀態的**:m_*******.get*******ctrl().checkbutton(nid,bcheck);以此來更新工具按鈕的狀態。

「工具按鈕的提示資訊」就是希望我們滑鼠落在工具條按鈕上時,能夠自動的給出按鈕的功能簡介:

(1)對於模態對話方塊,也需要手動新增訊息對映。網上已有成功的解決方案:

(2)對於非模態對話方塊,我們發現應用程式無法響應上面手動新增的訊息響應

1.定義乙個全域性變數:hhook hmeasurehook;

2.標頭檔案新增函式宣告:static lresult callback getmessageproc(int ncode, wparam wparam, lparam lparam);

3.原始檔新增定義:

lresult callback ctestdialog::getmessageproc(int ncode, wparam wparam, lparam lparam)

return ::callnexthookex(hmeasurehook, ncode, wparam, lparam);

}

4.在oninitdialog()中新增鉤子:

hmeasurehook = setwindowshookex(

wh_getmessage,

getmessageproc,

null,

getcurrentthreadid());

assert (hmeasurehook);

這樣就ok了

MFC 對話方塊程式 模式對話方塊與非模式對話方塊

一 根據主視窗型別,mfc軟體工程可以分為以下幾種架構模型 例如 記事本和畫筆等。2 mdi multiple document inte ce 多文件介面,乙個主框架視窗下可以同時編輯多份文件。例如 vc 6.0,photoshop等軟體。3 基於對話方塊的軟體模型 主視窗是通過資源管理器,在對話...

彈出模式對話方塊和彈出非模式對話方塊

非模式對話方塊 clistlink m plistlink null ssn return pishowlistdialog in ssn object id listtype,in ssn object id listdialogid m plistlink showwindow sw show ...

模式對話方塊與無模式對話方塊

顯示子窗體 1 showdialog 無模式對話方塊 babywindow.showdialog 顯示子窗體 showdialog 無模式對話方塊 無模式 窗體讓您在此窗體與另一窗體之間變換焦點,而不必關閉初始窗體。使用者在該窗體顯示的同時可繼續在任何應用程式的其他位置工作。例如 文字編輯軟體裡面的...