標籤:修改 img 建立 view todo resource new 利用 訊息
本文僅用於學習交流,商業用途請支援正版!轉載請註明:http://www.cnblogs.com/mxbs/p/6285902.html
利用MFC編程時,功能表項目狀態的維護依賴於CN_UPDATE_COMMAND_UI訊息,我們可以手工或利用ClassWizard在訊息映射中添加ON_UPDATE_COMMAND_UI宏來捕獲CN_UPDATE_COMMAND_UI訊息。
示,接下來,我們使Edit子功能表下的Cut功能表項目變為可用狀態。
開啟類嚮導對話方塊,在架構類中添加如下函數,選擇對象ID為ID_EDIT_CUT,Message列表框中選擇UPDATE_COMMAND_UI訊息,單擊Add Handler添加訊息響應函數,Edit Code。
這樣,在架構類檔案中添加了如下資訊,
標頭檔中資訊:
afx_msg void OnUpdateEditCut(CCmdUI *pCmdUI);
源檔案資訊一:
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)
…
ON_UPDATE_COMMAND_UI(ID_EDIT_CUT, &CMainFrame::OnUpdateEditCut)
END_MESSAGE_MAP()
源檔案資訊二:
void CMainFrame::OnUpdateEditCut(CCmdUI *pCmdUI)
{
// TODO: Add your command update UI handler code here
}
備忘:UI即使用者介面(User Interface),UPDATE_COMMAND_UI訊息只能應用於功能表項目,不能應用於永久顯示的頂級菜單(即彈出式菜單)項目。
利用CCmdUI類的Enable函數實現功能表項目的可用或禁用功能,代碼如下:
void CMainFrame::OnUpdateEditCut(CCmdUI *pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI ->Enable();//預設為可用
// pCmdUI ->Enable(false);//false為不可用
}
運行可以看到工具列和功能表項目中的剪下功能都可用了。那麼二者是如何關聯的呢?通過分別查看Resource View下的Menu和Toolbar可以知道,功能表列和工具列下的剪下功能ID都是ID_EDIT_CUT,由此可知,如果要把工具列上的一個工具按鈕和功能表列中的某個功能表項目相關聯,只要將它們的ID設為一致即可。
以禁用【檔案】子功能表下的【建立】功能表項目為例:
利用功能表項目標識訪問功能表項目進行狀態設定:
添加UPDATE_COMMAND_UI訊息響應函數,具體代碼如下:
void CMainFrame::OnUpdateFileNew(CCmdUI *pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI ->Enable(false);
}
運行可發現【建立】功能表項目已經被禁用。
CCmdUI類有一個成員變數m_nID用於儲存當前功能表項目、工具列按鈕、或者是其他由CCmdUI對象表示的UI對象的標識。我們可以利用其進行判斷是哪一個功能表項目,當然實際應用時無需判斷。
void CMainFrame::OnUpdateFileNew(CCmdUI *pCmdUI)
{
// TODO: Add your command update UI handler code here
if(ID_FILE_NEW == pCmdUI ->m_nID)
pCmdUI ->Enable(false);
}
CCmdUI類還有一個成員變數m_nIndex用於儲存當前功能表項目的位置索引。
if(2 == pCmdUI -> m_nIndex) //利用位置索引進行判斷
注意:計算功能表項目索引時必須把分隔欄功能表項目計算在內。
在【剪下】功能表項目的UI命令中利用位置索引進行判斷時,會發現工具列上的按鈕狀態並沒有改變,這是因為功能表項目和工具列按鈕的位置索引計算方式不同,它們都是從0計數,但可能位置索引不是一一對應的,因此為了保證二者狀態的一致性,最好採用功能表項目標識或工具列按鈕標識(二者一致)的方式來進行設定。
MFC採用的命令更新機制:
我們可以用類嚮導添加UPDATE_COMMAND_UI訊息響應函數,而MFC在後台所做的工作是:當要顯示菜單時,作業系統發出WM_INITMENUPOPUP訊息,然後由程式視窗的基類如CFrameWnd接管。它會建立一個CCmdUI對象,並與程式的第一個功能表項目相關聯,調用該對象的一個成員函數DoUpdate(),這個函數發出CN_UPDATE_COMMAND_UI訊息,這個訊息帶有一個指向CCmdUI對象的指標。這時系統會判斷是否存在一個ON_UPDATE_COMMAND_UI宏去捕獲這個功能表項目訊息。如果有則調用相應的訊息響應函數進行處理,在這個函數中可以利用傳遞的CCmdUI對象去調用相應的函數來修改菜單狀態。當更新完第一個功能表項目後,同一個CCmdUI對象就設定為與第二個功能表項目相關聯,依此順序進行,直到完成所有功能表項目的處理。
總結:如果要在程式中設定某個功能表項目的狀態,首先通過ClassWizard為這個功能表項目添加UPDATE_COMMAND_UI訊息響應函數,然後在這個函數中進行狀態的設定即可。
如果有疑問,可以聯絡[email protected],更多內容請參考:http://www.cnblogs.com/mxbs/,技術交流請加QQ群:586571286。
菜單基本操作(二)