VC菜單與加速鍵
1. Windows消息
在Windows中,消息有以下三種類型:
(1) 標準Windows消息:指以WM_爲前綴的那些消息(除了WM_COMMAND),如窗口移動消息WM_MOVE,窗口大小改變消息WM_SIZE,此外,如程序啓動或退出,窗口創建和關閉等等。
(2) 控件通知消息:由編輯框,列表框等控件或子窗口發給其父窗口的通知消息,以WM_COMMAND爲消息名,在消息中包含有控件通知代碼,以區分具體的控件通知消息。
(3) 命令消息:命令消息也以WM_COMMAND爲消息名,在消息中包含有命令的標識符(ID),以區分具體的命令。命令消息的來源是以下三種用戶接口對象:
菜單:用戶選擇某菜單項,要產生相應的命令消息。
工具欄:用戶按下某工具欄按鈕產生相應的命令消息。
加速鍵:用戶在鍵盤上按下了定義的加速鍵也將產生相應的命令消息。
2.創建菜單和加速鍵示例程序
(1) 創建一個SDI工程,名稱是:CMenuExample。
(2)打開ResourceView標籤,展開Menu項。添加“我的菜單”,然後在其下面創建兩個子項:ID_MYMENU_HELLOWORLD,“HelloWord(&S)”;ID_MYMENU_HELLOC,“HelloVC++(&V)”。Prompt中可以添加顯示在狀態條中的提示信息。
(3)爲ID_MYMENU_HELLOWORLD添加COMMAND消息函數。同時爲ID_MYMENU_HELLOC添加COMMAND消息函數。其實現代碼如下:
void CCMenuExampleView::OnMymenuHelloc()
{
// TODO: Add your command handler code here
MessageBox("您點的Hello VC++!","Hello VC++!");
}
void CCMenuExampleView::OnMymenuHelloworld()
{
// TODO: Add your command handler code here
MessageBox("您點的HelloWorld!","HelloWorld!");
}
(4) 爲上述兩個菜單項添加對應的鍵盤加速鍵。在工作區ResourceView標籤,展開Accelerator項,在IDR_MAINFRAME上雙擊,啓動加速鍵編輯器。在最後的虛框上雙擊鼠標,分別輸入ID,Key組合框中輸入或選擇相應的加速鍵。分別爲F11和F12。在“HelloWorld(&S)”後面加上“/tF11”。同理,另一個爲”/tF12”。
(5) 下面爲“HelloWorld”添加菜單項的狀態更新處理。爲視圖類加一個成員變量。 BOOL m_hHaveHelloWorld;然後在視圖類的構造函數中初始化次變量如下:
CCMenuExampleView::CCMenuExampleView()
{
// TODO: add construction code here
m_hHaveHelloWorld = TRUE;
}
爲“HelloWorld”菜單項的更新用戶接口對象狀態命令添加消息處理函數。
ID_MYMENU_HELLOWORLD添加UPDATE_COMMAND_UI消息。如下:
void CCMenuExampleView::OnUpdateMymenuHelloworld(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(m_hHaveHelloWorld);
}
在視圖類中添加改變m_hHaveHelloWorld成員變量值的函數。在這裏我們響應鼠標的左鍵,m_hHaveHelloWorld置爲FALSE,右鍵置爲TRUE。如下:
void CCMenuExampleView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
MessageBox("Sorry,你不能點這個按鈕了!","Sorry!");
m_hHaveHelloWorld = FALSE;
CView::OnLButtonDown(nFlags, point);
}
void CCMenuExampleView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
MessageBox("運氣不錯,你可以點此按鈕!","Good Luck!");
m_hHaveHelloWorld = TRUE;
CView::OnRButtonDown(nFlags, point);
}
編譯連接運行本程序。