win32之菜单
菜单是软件开发之中不可或缺的一个部分,正因为菜单我们才能对一个软件窗口进行丰富多彩的操作,今天主要介绍win32的菜单的创建和其他菜单的相关函数。
本次使用的开发环境是vs2013,使用的开发语言是C/C++, 创建的项目是win32项目
这次主要介绍的是通过软件加载的方式进行菜单的创建,其实在vs2013的win32项目里面我们也可以直接添加菜单资源
我们可以在这里进行菜单项的编辑,添加和删除也可以对每一项进行属性的编辑
对属性进行编辑,选中某一项,单击鼠标右键
在右侧会出现属性编辑栏
然后我们需要定义菜单句柄然后加载菜单资源。(可以从资源里面找到菜单资源ID)
1菜单的分类
菜单的分类并没有一个严格的划分,但是按照不同的标准我们可以对菜单进行不同的类别的分类
分类一
顶层菜单--在我们窗口上面的菜单
右键菜单--鼠标右键出现的菜单
系统菜单--点击非客户区右键弹出的菜单
分类二
//菜单 window中一个很重要的用户界面
//分为三类:静态菜单,动态菜单,快捷菜单
//静态菜单:是在菜单编辑器里预先编辑好的,直接显示的
//动态菜单:在程序运行过程中创建及显示
//快捷菜单:是前两种组合
2.系统菜单
2.1.获取系统菜单
返回菜单句柄GetSystemMenu(窗口句柄, 标志);
标志:true--- 删除旧菜单,回复到默认菜单
False—返回当前系统菜单
2.2删除系统菜单
DeleteMenu(菜单句柄, 标记, 删除方式);
删除方式:MF_BYCOMMAND:为默认值。说明参数nIDCheckItem表示菜单项的ID
MF_BYPOSITION:说明参数Item表示菜单项的位置,第一个菜单项的位置是0
2.3 添加系统菜单
AppendMenu(菜单句柄, 模式,菜单ID,显示字符);
MF_STRING:添加的是字符串
MF_BITMAP:将位图用作菜单项。lpNewltem里含有该位图的句柄。
MF_DISABLED:菜单项无效,该项不能被选择,菜单项不变灰。
MF_ENABLED:菜单项有效,使该项能被选择,从变灰的状态恢复。
MF_GRAYED:使菜单项无效并变灰,使其不能被选择。
MF_OWNERDRAW:指定该菜单项为自绘制菜单项。(菜单第一次显示前,拥有菜
单的窗口接收一个WM_MEASUREITEM消息来得到菜单项的宽和高。
只要菜单项被修改,都将发送WM_DRAWITEM消息给菜单拥有者的窗口程序)
MF_POPUP:指定菜单打开一个下拉式菜单或子菜单。
MF_SEPARATOR:画一条水平区分线,下拉式菜单使用。参数IpNew和uID无用。
2.4系统菜单相应
WM_SYSCOMMEND消息.wparam的低字节是菜单ID.
3右键菜单
3.1创建菜单
CreatePopupMenu()创建右键菜单,是弹出式菜单,创建后返回句柄
3.2添加显示
添加菜单项:AppendMenu()参数如上
显示菜单:
TrackPopupMenu( 菜单句柄 显示方式 屏幕x坐标,屏幕Y坐标,0,窗口句柄,NULL )
注意:右键消息得到的x和y是客户端坐标,需要转换成屏幕坐标
POINT p; p.x = LOWORD(WPARAM) p.y = HIWORD(WPARAM);
客户端转换成屏幕坐标:ClienttoScreen(窗口句柄,point指针)
3.3消息响应:
点击菜单发送: WM_COMMAND消息 wparam的低字节是菜单ID.
4.顶层菜单
4.1顶层菜单
顶层菜单 = 多个弹出式菜单项+弹出式菜单每一项
创建顶层菜单: HMENU hMenu = CreateMenu(void)
创建弹出式菜单: HMEUE createPopupMenu(void);
把弹出式菜单插入顶层菜单:
AppendMenu(顶层菜单句柄, MF_POPUP,弹出式菜单句柄,菜单名称);
AppendMenu(弹出式菜单句柄,菜单风格,菜单ID,菜单名称 )
4.2.菜单消息响应
WM_COMMEND ----- WPARA 低字节保存的是菜单的ID
根据菜单的id处理不同的菜单项
其他相关的菜单函数
使菜单项失效(**或者静默菜单)
EnableMenuItem(hmenu, 5002, MF_BYCOMMAND | MF_GRAYED);设置菜单,使菜单在这个位置刷新
SetMenu(hWnd, hmenu);//在hWnd这个窗口,重新设置一次hmenu
修改菜单
ModifyMenu(hmenu, 8002, MF_BYCOMMAND, 9002, _T("点我"));
获取子菜单
//GetSubMenu(h,0)得到h这个菜单句柄的0下标子列