天天看點

Windows基礎程式設計 -菜單前言分類菜單消息傳遞的參數

前言

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 光标位置