读书人

lt;Win32_16gt;来见见标准菜单和右键菜单的

发布时间: 2013-10-08 16:38:32 作者: rapoo

<Win32_16>来看看标准菜单和右键菜单的玩法

日常应用中,菜单主要分为两种:(1) 标准菜单(处于应用程序菜单栏处的菜单) (2)右键快捷菜单

几乎你所见过或使用过的软件中,都有它俩儿

为应用程序添加它们的基本步骤:

(1)用代码或者IDE创建一个菜单资源

(2)加载、显示菜单菜单

(3)如果是右键菜单,在获取右键坐标按下的坐标时,还应该将它转换为屏幕坐标(ClientToScreen) —— 后面有原因解析

(4)在WM_COMMANG消息中响应对应的操作

下面,我就来讲一下标准菜单和右键菜单的创建以及用法

(1)首先,不管是标准菜单还是右键菜单,都需要先创建,创建的方式有两种:

1>代码方式,用CreateMenu函数来创建(为了方便,我这里就不用代码方式了,我选择IDE创建方式)

2>用IDE提供的创建方式(就是添加资源,和添加位图资源是一回事儿,这里就是新建菜单)

(2)我这里,为了区分,为标准菜单和右键菜单各自创建了一个菜单资源

1>标准菜单

<Win32_16>来见见标准菜单和右键菜单的玩法

菜单ID为IDR_MENU

子菜单项椭圆ID为IDM_ELLIPSE

子菜单项矩形ID为IDM_RECT

子菜单项退出ID为IDM_EXIT

2>右键菜单

<Win32_16>来见见标准菜单和右键菜单的玩法

右键菜单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;


下面来看看运行效果:

<Win32_16>来见见标准菜单和右键菜单的玩法

1楼u0104753547小时前
博主,已经把你博客地址收藏下来了,文章要慢慢细读。请问你有没有做过滑块(slider)的自绘?
Re: crocodile_5小时前
回复u010475354n你的意思是做一个Slider控件吗?n如果是,可以参见我的博文nhttp://blog.csdn.net/crocodile__/article/details/10273185n专讲控件的创建以及使用方法nn如果不是,请明晰……

读书人网 >编程

热点推荐