win32(5)--Windows菜单
来源:互联网 发布:n9软件网 编辑:程序博客网 时间:2024/06/05 06:16
Windows程序的菜单,分为三大类:系统菜单、弹出式菜单(右键菜单)、顶层菜单(下拉式菜单)。
系统菜单:
在windows程序左上角的图标点击鼠标左键、或者在标题栏点击鼠标右键,出现的就是系统菜单。主要内容有:还原、移动、大小、最小化、最大化、关闭。
1、获取系统菜单:
HMENU WINAPI GetSystemMenu( _In_ HWND hWnd, _In_ BOOL bRevert);
参数:bRevert,TRUE–恢复到默认的系统菜单(将删除所有自己定义的系统菜单项),FALSE–获取当前的系统菜单。
2、添加系统菜单:
BOOL WINAPI AppendMenuW( HMENU hMenu, UINT uFlags, UINT_PTR uIDNewItem, LPCWSTR lpNewItem);
参数:uFlags,标志,常用的MF_STRING(字符串),MF_SEPARATOR(分割线)
uIDNewItem,菜单ID,lpNewItem,菜单名字。
3、删除系统菜单:
BOOL WINAPI DeleteMenu( HMENU hMenu, UINT uPosition, UINT uFlags);
参数:uPosition,菜单ID或者菜单position Index,uFlags,删除标志: MF_BYPOSITION —通过索引删除,MF_BYCOMMAND–通过菜单id方式删除
4、获取菜单总数
Int WINAPI GetMenuItemCount(HMENU hMenu); 注意,分隔符也会作为菜单项的
5、获取position Index位置的菜单项ID
UINT WINAPI GetMenuItemID( HMENU hMenu, int nPos);
一般情况下,分隔符菜单的ID设置为0。
6、系统菜单的消息处理WM_SYSCOMMAND
系统菜单点击以后产生的消息是WM_SYSCOMMAND,wParam中存放的是菜单ID。
弹出式菜单(右键菜单):
在windows程序的窗口中点击鼠标右键(必要的时候左键也可以)弹出的菜单,或者顶层菜单点击后出现的菜单,都称为弹出式菜单(也称为右键菜单)。
1、创建弹出式菜单
HMENU WINAPI CreatePopupMenu(VOID); 返回创建弹出式菜单的菜单句柄
2、添加、删除菜单项,同上面的系统菜单。
AppendMenu,DeleteMenu。
3、销毁弹出式菜单
BOOL WINAPI DestroyMenu( _In_ HMENU hMenu); 弹出式菜单是自己创建的,所以在不需要的时候,使用DestroyMenu销毁菜单。
4、显示弹出式菜单
BOOL WINAPI TrackPopupMenu( _In_ HMENU hMenu,
_In_ UINT uFlags, //标志,比如TPM_LEFTALIGN,菜单左边在x的位置
_In_ int x, _In_ int y, //注意:屏幕坐标x,y
_Reserved_ int nReserved,
_In_ HWND hWnd,
_Reserved_ CONST RECT *prcRect); //用屏幕坐标定义的一个矩形,如用户在这个矩形的范围内单击,则弹出式菜单不会关闭。如单击弹出式菜单之外的任何一个地方,则会关闭菜单。可以设为NULL。该函数为阻塞函数。
5、弹出式菜单的消息处理WM_COMMAND
弹出式菜单点击以后,发送消息WM_COMMAND,wParam保存菜单项ID。
顶层菜单(下拉式菜单)
1、创建顶层菜单
HMENU WINAPI CreateMenu(VOID);
2、添加顶层菜单项(添加在后面)
AppendMenu,同样可以添加菜单项,同样通过WM_COMMAND消息响应。
3、插入菜单项
BOOL WINAPI InsertMenu(HMENU hMenu,
UINT uPosition, //插入位置,注意:这里可写位置也可写ID,必须和下面的uFlags配合使用,MF_BYPOSITION或者MF_BYCOMMAND(默认是这个),会插入在该位置或该ID的前面。
UINT uFlags, //菜单项的标志
UINT_PTR uIDNewItem, //菜单项目ID
LPCWSTR lpNewItem); //菜单项的字符串
另外一个插入菜单项的函数:InsertMenuItem
BOOL WINAPI InsertMenuItem( _In_ HMENU hmenu,
_In_ UINT item, //位置索引号 或者 菜单项ID
_In_ BOOL fByPosition, //设为TRUE,item为菜单项的位置索引号,设为FALSE,item为菜单项的ID
_In_ LPCMENUITEMINFOA lpmi); //MENUINFO结构体指针
typedef struct tagMENUINFO
{
DWORD cbSize; //结构的大小,sizeof(MENUINFO)
DWORD fMask; //将要获得或者设置的项目,后面的哪些参数发挥作用受该参数的设置的影响。MIIM_BITMAP,hbmpItem将用来设置或返回按钮的位图,MIIM_ID,wID设置或返回菜单项的ID
DWORD dwStyle;//设置或返回菜单项的类型,MFT_BITMAP位图;MFT_STRING字符串;MFT_OWNERDRAW,//发送WM_DRAWITEM和WM_MEASUREITEM消息用于绘制菜单项
UINT cyMax;
HBRUSH hbrBack;
DWORD dwContextHelpID;
ULONG_PTR dwMenuData;
} MENUINFO, FAR *LPMENUINFO;
4、修改菜单项(ModifyMenu)
BOOL WINAPI ModifyMenu(HMENU hMnu,
_In_ UINT uPosition, //位置或ID,与下面的uFlags配合使用
_In_ UINT uFlags, //MF_STRING MF_BYPOSITION MF_BYCOMMAND等等
_In_ UINT_PTR uIDNewItem, //修改后的ID
_In_opt_ LPCWSTR lpNewItem); //修改后的字符串
另外一个修改菜单项的函数:
BOOL WINAPI SetMenuItemInfoW(HMENU hmenu,UINT item, BOOL fByPositon, LPCMENUITEMINFOW lpmii);
5、设置顶层菜单(显示菜单)
BOOL WINAPI SetMenu(HWND hWnd, HMENU hMenu); 一般在窗口的WM_CREATE中使用,让顶层菜单显示在窗口的顶层。
6、刷新菜单(菜单项修改后重新显示)
BOOL WINAPI DrawMenuBar(HWND hWnd); 添加或者删除顶层菜单项以后,需要使用该函数及时地刷新菜单的显示。
7、创建弹出式菜单并添加弹出式菜单的菜单项。
同上,使用CreatePopupMenu和AppendMenu、InsertMenu。
8、关联顶层菜单和弹出式菜单。
还是使用AppendMenu,只不过参数有些不同。
BOOL WINAPI AppendMenuW( HMENU hMenu, UINT uFlags, UINT_PTR uIDNewItem, LPCWSTR lpNewItem);
AppendMenu(顶层菜单句柄,MF_POPUP,(UINT)弹出式菜单句柄,顶层菜单项字符串);
对于在弹出式菜单中再增加一个弹出式菜单,也是同样的方法。
9、获取菜单句柄
HMENU WINAPI GetMenu(HWND hWnd); //获取窗口的顶层菜单
10、获取子菜单句柄
HMENU WINAPI GetSubMenu(HMENU hMenu, int nPos); //获取子菜单的句柄
11、菜单项的勾选
在添加菜单项的时候,可以用 MF_STRING | MF_CHECKED | MF_UNCHECKED 来设置是否勾选。
动态改变:CheckMenuItem
DWORD WINAPI CheckMenuItem(HMENU hMenu,UINT uIDCheckItem,UINT uCheck);
CheckMenuItem(hMenu, 3001, MF_UNCHECKED|MF_BYCOMMAND ); //设置不勾选
CheckMenuItem(hMenu, 2, MF_CHECKED|MF_BYPOSITION ); //设置勾选
12、菜单项可用不可用设置
在初始化的时候,假如需要该菜单项不能被点击,可以使用MF_STRING | MF_GRAYED设置为灰色(不能点击)。
动态改变:EnableMenuItem
EnableMenuItem(Hm, 3002, MF_ENABLED | MF_BYCOMMAND); //设置为可以点击
EnableMenuItem(Hm, 1, MF_DISABLED | MF_BYPOSITION); //设置为不可点击
13、菜单项前面加图标
在正常的添加菜单项的后面再加上一句:
BOOL WINAPI SetMenuItemBitmaps(
_In_ HMENU hMenu,
_In_ UINT uPosition, //位置或者ID,配合uFlags使用
_In_ UINT uFlags, //MF_BYPOSITION MF_BYCOMMAND
_In_opt_ HBITMAP hBitmapUnchecked, //非选择
_In_opt_ HBITMAP hBitmapChecked); //选择
这个适合在弹出式菜单
- win32(5)--Windows菜单
- windows菜单及其它资源---Win32
- Windows编程(2)|Win32建立菜单
- WIN32汇编: 8.菜单
- Win32的菜单编程
- Win32程序(2) 菜单
- Win32程序菜单
- Win32 API 菜单函数
- WIN32菜单基本操作
- win32 创建右键菜单
- win32学习10.菜单
- win32菜单练习复习
- 如何在Smartphone的Win32程序中使用Windows的通用菜单资源(MENU而不是SHMENUBAR)
- win32动态生成窗体菜单
- win32消息与菜单创建
- win32 菜单资源的载入
- win32 API创建菜单资源
- win32开发(添加菜单)
- Java面试技术点
- Vuforia开发基础(二):官方demo解析
- Time in the Subway: 猜数字小游戏(GuessNum)--Java代码实现
- java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread.
- freeRTOS学习之xTaskCreat
- win32(5)--Windows菜单
- 减小ipa体积
- MATLAB 函数fspecial支持的空间滤波器
- Android-源码解析Handler&Looper
- Linux下SVN使用笔记
- Mysql5.7.18Zip安装配置
- mysql之 mysql 5.6不停机主从搭建(一主一从基于日志点复制)
- c# 之委托 匿名函数 lamada表达式
- C语言的#运算符