利用菜單接受用戶命令是一中很簡單的交互方法,同時也是一種很有效的方法。通常菜單作為一中資源存儲在文件中,因此我們可以在設計時就利用資源編輯器設計好一個菜單。關於使用VC設計菜單我就不再多講了,但你在編寫菜單時應該盡量在屬性對話框的底部提示(Prompt)處輸入文字,這雖然不是必要的,但MFC在有狀態欄和工具條的情況下會使用該文字,文字的格式為“狀態欄出說明 工具條提示”。
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
圖33_g1
我們要面臨的任務是如何知道用戶何時選擇了菜單,他選的是什麼菜單項。當用戶選擇了一個有效的菜單項時系統會向應用發送一個WM_COMMAND消息,在消息的參數中表明來源。在MFC中我們只需要進行一次映射,將某一菜單ID映射到一處理函數,圖33_g2。在這裡我們在CView的派生類中處理菜單消息,同時我對同一ID設置兩個消息映射,接下來將這兩種映射的作用。
ON_COMMAND 映射的作用為在用戶選擇該菜單時調用指定的處理函數。如:ON_COMMAND(IDM_COMMAND1, OnCommand1)會使菜單被選擇時調用OnCommand1成員函數。
ON_UPDATE_COMMAND_UI(IDM_COMMAND1, OnUpdateCommand1) 映射的作用是在菜單被顯示時通過調用指定的函數來進行確定其狀態。在這個處理函數中你可以設置菜單的允許/禁止狀態,其顯示字符串是什麼,是否在前面打鉤。函數的參數為CCmdUI* pCmdUI,CCmdUI是MFC專門為更新命令提供的一個類,你可以調用
Enable 設置允許/禁止狀態
SetCheck 設置是否在前面打鉤
SetText 設置文字
下面我講解一個例子:我在CView派生類中有一個變量m_fSelected,並且在視中處理兩個菜單的消息,當IDM_COMMAND1被選時,對m_fSelected進行邏輯非操作,當IDM_COMMAND2被選中時出一提示;同時IDM_COMMAND1根據m_fSelected決定菜單顯示的文字和是否在前面打上檢查符號,IDM_COMMAND2根據m_fSelected的值決定菜單的允許/禁止狀態。下面是代碼和說明:
void CMenuDView::OnCommand1()
{
m_fSelected=!m_fSelected;
TRACE("command1 selected ");
}
void CMenuDView::OnUpdateCommand1(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_fSelected);//決定檢查狀態
pCmdUI->SetText(m_fSelected?"當前被選中":"當前未被選中");//決定所顯示的文字