症狀:
從命令使用者介面處理函式(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 ...