來看看標準選單和右鍵選單的玩法
我的郵箱:[email protected] 歡迎大家和我交流程式設計心得
日常應用中,選單主要分為兩種:(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;
下面來看看執行效果: