1. 程式人生 > >來看看標準選單和右鍵選單的玩法

來看看標準選單和右鍵選單的玩法

我的郵箱:[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;

下面來看看執行效果: