基於對話方塊應用程式中選單更新問題處理

2021-04-14 10:47:38 字數 1116 閱讀 9353

症狀:    

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

void   ctestdlg::onupdatefileexit(ccmdui*   pcmdui    

原因:在下拉列表顯示的時候,   wm_initmenupopup訊息被先傳送以顯示選單項。mfc   cframewnd::oninitmenupopup   函式遍歷選單項並為每個選單項呼叫更新命令處理函式(如果有的 話).選單的外觀被更新以反映它的狀態(啟用/禁用,選擇/取消選擇)更新使用者介面機制在基於對話方塊的應用程式中不能工作,因為cdialog沒有oninitmenupopup   處理函式,而使用cwnd's   預設處理函式,該函式沒有為選單項呼叫更新命令處理函 數。    

解決方法:   

適用下列步驟解決此問題 

1、在訊息對映中新增on_wm_initmenupopup項

2、在你的對話方塊類中新增oninitmenupopup成員函式且複製下列**到該函式(注意:**   基本上是從cframewnd::oninitmenupopup(在winfrm.cpp中)複製過來的);

void cthjctrlwnd::oninitmenupopup(cmenu* ppopupmenu, uint nindex, bool bsy**enu)}}

}state.m_nindexmax = ppopupmenu->getmenuitemcount();

for (state.m_nindex = 0; state.m_nindex < state.m_nindexmax;

state.m_nindex++)

state.doupdate(this, false);    // popups are never auto disabled

}else

// adjust for menu deletions and additions

uint ncount = ppopupmenu->getmenuitemcount();

if (ncount < state.m_nindexmax)

}state.m_nindexmax = ncount;}}

對話方塊程式無法響應選單更新的問題

解決方法為 使對話方塊響應wm initmenupopup訊息,然後在訊息響應中加入以下 以下 為mfc的frame響應選單更新的源 assert ppopupmenu null check the enabled state of various menu items.ccmdui state s...

隱藏基於對話方塊程式

定義托盤響應訊息 define wm systray wm user 120 在標頭檔案中定義變數 windowplacement m wp 以便在恢復時使用 notifyicondata m tmid 托盤結構 crect m rectwnd 儲存視窗區域 在初始化函式中加入 getwindowr...

MFC基於對話方塊程式

001 020 else if nresponse idcancel 如果對話方塊是用取消來關閉的,則 021 025 026 由於對話方塊已關閉,所以將返回 false 以便退出應用程式,027 而不是啟動應用程式的訊息幫浦。028 return false 029 因為initinstance ...