Windows菜单
?
目錄
第1章 Windows菜單????1
1.1 窗口菜單和彈出菜單????1
1.2 使用SetMenu????2
1.3 使用TrackPopupMenu????4
?
?
第1章 Windows菜單
1.1 窗口菜單和彈出菜單
Windows菜單分為兩類:窗口菜單和彈出菜單。窗口菜單主要用來放在某個窗口上。彈出菜單有兩個作用,一是鼠標右鍵單擊時顯示的菜單;二是作為子菜單添加到窗口菜單。
打開"記事本"程序,右鍵菜單就是一個彈出菜單:
圖1.1 彈出菜單
"記事本"程序的菜單欄部分就是一個窗口菜單,它又包含了"文件""編輯"……這些彈出菜單。
圖1.2 窗口菜單
窗口菜單由CreateMenu創建,使用SetMenu將其設置到某個窗口,使用DestroyMenu銷毀。
彈出菜單由CreatePopupMenu創建,使用AppendMenu或InsertMenuItem將其添加到窗口菜單或上一級彈出菜單,也可以使用TrackPopupMenu顯示彈出菜單。彈出菜單的銷毀同樣是調用DestroyMenu函數。
1.2 使用SetMenu
下面以代碼的方式創建圖1.2所示的窗口菜單:
//創建窗口菜單
HMENU hMenuWnd = ::CreateMenu();
{//創建"文件"彈出菜單,并將其添加到窗口菜單
//創建"文件"菜單,這是一個彈出菜單
HMENU hMenuFile = ::CreatePopupMenu();
//給"文件"菜單添加"新建"菜單項,0x8000是菜單項ID號
::AppendMenu(hMenuFile,MF_STRING,0x8000,_T("新建"));
//給"文件"菜單添加"打開"菜單項
::AppendMenu(hMenuFile,MF_STRING,0x8001,_T("打開"));
//給"文件"菜單添加一條分隔線
::AppendMenu(hMenuFile,MF_SEPARATOR,0,NULL);
//繼續給"文件"菜單添加菜單項
... ... ... ...
//將整個"文件"菜單添加到窗口菜單
::AppendMenu(hMenuWnd,MF_POPUP,(UINT)hMenuFile,_T("文件"));
}
{//創建"編輯"彈出菜單,并將其添加到窗口菜單
//創建"編輯"菜單,這是一個彈出菜單
HMENU hMenuEdit = ::CreatePopupMenu();
//給"編輯"菜單添加菜單項
... ... ... ...
//將整個"編輯"菜單添加到窗口菜單
::AppendMenu(hMenuWnd,MF_POPUP,(UINT)hMenuEdit,_T("編輯"));
}
{//創建"格式"彈出菜單,并將其添加到窗口菜單
... ... ... ...
}
{//創建"查看"彈出菜單,并將其添加到窗口菜單
... ... ... ...
}
{//創建"幫助"彈出菜單,并將其添加到窗口菜單
... ... ... ...
}
//將窗口菜單設置到窗口上
::SetMenu(hWnd,hMenuWnd);
代碼說明:
1、SetMenu的第二個參數必須是窗口菜單句柄,即這個句柄必須由CreateMenu函數創建,而不能是CreatePopupMenu創建的彈出菜單句柄。
2、::AppendMenu(hMenuWnd,MF_POPUP,(UINT)hMenuFile,_T("文件"));將彈出菜單hMenuFile添加到窗口菜單hMenuWnd。它只是把hMenuFile這個句柄添加到hMenuWnd所維護的數據結構里,即它添加的只是彈出菜單的一個引用,并不是把彈出菜單的所有菜單項添加到窗口菜單。因此,可以先將hMenuFile添加到hMenuWnd,再給hMenuFile添加菜單項,如下面的代碼所示:
{//創建"文件"彈出菜單,并將其添加到窗口菜單
//創建"文件"菜單,這是一個彈出菜單
HMENU hMenuFile = ::CreatePopupMenu();
//將整個"文件"菜單添加到窗口菜單
::AppendMenu(hMenuWnd,MF_POPUP,(UINT)hMenuFile,_T("文件"));
//給"文件"菜單添加"新建"菜單項,0x8000是菜單項ID號
::AppendMenu(hMenuFile,MF_STRING,0x8000,_T("新建"));
... ... ... ...
}
3、DestroyMenu(hMenuWnd)將銷毀它的子菜單、孫菜單。也就是說執行DestroyMenu(hMenuWnd)之后,hMenuFile、hMenuEdit……也被銷毀了。上面的代碼里,在::SetMenu(hWnd,hMenuWnd);之前增加如下測試代碼:
DestroyMenu(hMenuWnd);
hMenuWnd = ::CreateMenu();
::AppendMenu(hMenuWnd,MF_POPUP,(UINT)hMenuFile,_T("文件"));
DestroyMenu(hMenuWnd);將銷毀hMenuWnd和hMenuFile,所以AppendMenu將會增加無效的hMenuFile給hMenuWnd。可以想象,"文件"菜單里是不會有菜單項的。
4、何時調用DestroyMenu(hMenuWnd)銷毀窗口菜單呢?應該是不再使用時銷毀,具體的就是在處理窗口的WM_DESTROY消息時銷毀,或者在SetMenu更換菜單后銷毀。
1.3 使用TrackPopupMenu
上一節的代碼里包含了彈出菜單的創建,并增加到窗口菜單。彈出菜單還有一個作用就是用來顯示圖1.1所示的右鍵彈出菜單,方法就是調用TrackPopupMenu函數。需要注意的是:TrackPopupMenu的第一個參數必須是一個彈出菜單的句柄,就是說它必須由CreatePopupMenu創建。
以上一節的代碼為例:
//可以顯示出彈出菜單
TrackPopupMenu(hMenuFile,...);
//無法顯示彈出菜單,因為hMenuWnd是一個窗口菜單,不是彈出菜單
TrackPopupMenu(hMenuWnd,...);
//GetSubMenu(hMenuWnd,0) 返回的其實就是hMenuFile
//因此下面的代碼可以正常顯示彈出菜單
TrackPopupMenu(GetSubMenu(hMenuWnd,0),...);
當使用LoadMenu從資源里載入菜單時,其返回的是一個窗口菜單句柄,直接傳遞給TrackPopupMenu是無法正常顯示的。必須使用GetSubMenu獲得窗口菜單里的彈出菜單句柄,才能正常調用TrackPopupMenu。
執行TrackPopupMenu之后,可以立即調用DestroyMenu銷毀菜單。
轉載于:https://www.cnblogs.com/hanford/p/6163690.html
總結
- 上一篇: sqlserver、oracle数据库排
- 下一篇: 回溯算法之幸运的袋子