前言
windows視窗建立以後,往裡頭添加菜單就是一件很有意義的事了,菜單關聯的東西有
-它本身是一種資源,有菜單句柄HMENU需要維護
-菜單點選會發出消息,需要知道怎麼維護相關的消息處理函數
分類
>視窗頂層菜單、彈出式菜單、系統菜單
視窗頂層菜單
資源
視窗頂層菜單是一個視窗下的一級菜單,把它稱作一個菜單欄(menu bar)更為合适,而裡頭的任何一項(沒有下一級)可以稱為
一個菜單項(menu item),有下一級的被稱為子菜單或者下拉菜單(即菜單項是一個新的菜單)
-通過函數CreateMenu我們可以建立一個視窗頂層菜單,它會傳回一個HMENU的句柄,這就是這個頂層菜單的資源,這是編寫程式
建立菜單的方式,還有一種圖形化建立資源檔案的方式建立,這裡你獲得的隻是一個辨別,如IDR_MENU
-然後通過函數AppendMenu/DeleteMenu可以往這個資源裡添加東西了,這裡頭可以添加的東西有菜單項(menu-item,對應一個
menu-item id),下拉菜單或子菜單(對應menu handle),這兩類的添加方式會導緻調用AppendMenu函數第二個第三個參數的區分.
-最後,我們可以用下面3種方式将這個菜單和對應的視窗關聯起來,
--a.使用SetMenu将HMENU和HWND進行綁定
--b.在設計視窗類時,對應的LPCTSTR lpszMenuName填上,這裡你需要用添加資源檔案進行填充
((MAKEINTERSOURCE(IDR_MENU)).
--c.建立視窗時,對應的HMENU hMenu填上,如果菜單是資源檔案的方式添加的,可以用LoadMenu獲得菜單句柄.
消息
視窗頂層菜單會産生兩種消息WM_COMMAND,WM_INITMENUPOPUP,分别對應點選menu-item和彈出式菜單時産生,如果是WM_COMMAND
消息,我們可以通過菜單項的id來區分到底是那一項被點選了,而WM_INITMENUPOPUP消息,則通過菜單句柄來區分了。
菜單項操作函數
menu-item可以通過函數CheckMenuItem 和EnableMenuItem來修改,它們分别有兩種用法注意區分。
彈出式菜單
彈出式菜單無法直接和視窗挂鈎,它隻能選擇1.加入視窗菜單。2.通過消息觸發(比如右鍵響應).
資源
-首先,我們可以用過函數CreatePopupMenu函數建立一個彈出式菜單。
-然後,依舊通過AppendMenu往這個菜單裡頭添加東西。
-最後,還是通過AppendMenu把它挂到視窗菜單或系統菜單下,或者通過在消息響應中調用TrackPopupMenu函數讓它短暫的
出現在客戶區任何地方,再通過點選對它進行響應,注意TrackPopupMenu是個阻塞函數。
消息
點選彈出式菜單是會産生WM_INITPOPUPMENU消息.
系統菜單
系統菜單是固定的,它無法被建立,隻能擷取,但是你可以修改它,基本上我們不會去改變它。
資源
-通過GetSystemMenu可以獲得系統菜單的句柄。
-依舊通過AppendMenu/DeleteMenu可以修改裡頭的菜單項,有意思的是你把裡面的東西删完了,你會發現這個視窗無法放大,
縮小,移動和關閉了。
消息
點選系統菜單會産生WM_SYSCOMMAND消息,而諸如最大化,最小化,關閉按鈕其實都是系統菜單裡的菜單項,是以點選關閉按鈕
其實并不會産生WM_DESTROY消息,而是産生WM_SYSCOMMAND的消息。
菜單消息傳遞的參數
type | wParam | lParam | note |
WM_COMMAND | (HI)0 (LO)菜單項ID | NULL | windows裡用的最多的消息 |
WM_INITMENUPOPUP | 菜單句柄 | 菜單索引和菜單辨別 | 無 |
WM_SYSCOMMAND | (LO)菜單項ID | 光标位置 | 無 |