本文由BlueCoder編寫 轉載請說明出處:
http://blog.csdn.net/crocodile__/article/details/10756295
我的郵箱:[email protected] 歡迎大家和我交流編程心得
我的微博:BlueCoder_黎小華 歡迎光臨^_^
日常應用中,菜單主要分爲兩種:(1) 標準菜單(處於應用程序菜單欄處的菜單) (2)右鍵快捷菜單
幾乎你所見過或使用過的軟件中,都有它倆兒
爲應用程序添加它們的基本步驟:
(1)用代碼或者IDE創建一個菜單資源
(2)加載、顯示菜單菜單
(3)如果是右鍵菜單,在獲取右鍵座標按下的座標時,還應該將它轉換爲屏幕座標(ClientToScreen) —— 後面有原因解析
(4)在WM_COMMANG消息中響應對應的操作
下面,我就來講一下標準菜單和右鍵菜單的創建以及用法
(1)首先,不管是標準菜單還是右鍵菜單,都需要先創建,創建的方式有兩種:
1>代碼方式,用CreateMenu函數來創建(爲了方便,我這裏就不用代碼方式了,我選擇IDE創建方式)
2>用IDE提供的創建方式(就是添加資源,和添加位圖資源是一回事兒,這裏就是新建菜單)
(2)我這裏,爲了區分,爲標準菜單和右鍵菜單各自創建了一個菜單資源
1>標準菜單
菜單ID爲IDR_MENU
子菜單項橢圓ID爲IDM_ELLIPSE
子菜單項矩形ID爲IDM_RECT
子菜單項退出ID爲IDM_EXIT
2>右鍵菜單
右鍵菜單ID爲IDR_CONTEXTMENU
子菜單項橢圓ID爲IDCM_ELLIPSE
子菜單項矩形ID爲IDCM_RECT
子菜單項退出ID爲IDCM_EXIT
(3)下面就是兩種菜單的添加方式
1>標準菜單的添加方式很簡單,因爲窗口中預留了一個菜單欄,就是來放菜單的,具體代碼如下:(在註冊窗口類之間修改lpszMenuName參數)
wndclass.lpszMenuName = MAKEINTRESOURCE(IDR_MENU);//加載標準菜單
2>右鍵菜單的添加方式
主要是使用TrackMenu這個函數來顯示,來看看msdn:
BOOL TrackPopupMenu(
HMENU hMenu,//菜單句柄 UINT uFlags,//位置標記 int x, //x座標 int y, //y座標 int nReserved,//必須爲0,不用管 HWND hWnd, //擁有右鍵菜單的窗口的句柄 HWND prcRect//忽略(NULL) );
具體代碼:(在右鍵按下消息中顯示右鍵菜單)case WM_RBUTTONDOWN: ptCm.x = LOWORD(lParam);//設定右鍵菜單座標 ptCm.y = HIWORD(lParam); /* 當前獲取的座標是客戶區座標 , 而TrackPopupMenu函數顯示的座標是屏幕座標 因此 , 需將ptCm轉換成屏幕座標(否則顯示位置不正確) */ ClientToScreen(hwnd, &ptCm); //顯示右鍵菜單 TrackPopupMenu(hSub, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_LEFTBUTTON, ptCm.x, ptCm.y, 0, hwnd, NULL); return 0;
(4)消息處理,這裏爲了方便,我給標準菜單和右鍵菜單一種同樣的相應方式
具體代碼如下:
case WM_COMMAND: //響應菜單消息 switch(LOWORD(wParam))//判斷子菜單項的ID { //菜單欄和右鍵菜單的子項相同 , 因此對應執行相同操作 case IDM_ELLIPSE: case IDCM_ELLIPSE: isEllipse = TRUE; InvalidateRect(hwnd, NULL, TRUE); break; case IDM_RECT: case IDCM_RECT: isEllipse = FALSE; InvalidateRect(hwnd, NULL, TRUE); break; case IDM_EXIT: case IDCM_EXIT: if(IDYES == MessageBox(hwnd, TEXT("確定離開嗎?"), TEXT("提示"), MB_YESNO)) SendMessage(hwnd, WM_CLOSE, wParam, lParam); } return 0;
下面來看看運行效果: