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

本文由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;


 

 

下面來看看運行效果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章