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); //选择

这个适合在弹出式菜单