WIN32用户界面设计基础之Menus 篇
来源:互联网 发布:淘宝账号如何快速升心 编辑:程序博客网 时间:2024/05/14 04:00
WIN32用户界面设计基础之Menus 篇
三、 菜单的动态更改
1、 插入新的菜单项InsertMenuItem()
首先填写MENUINFO结构
typedef struct tagMENUITEMINFO {
UINT cbSize; 结构的大小,sizeof(MENUINFO)
NT fMask; 将要获得或者设置的项目,后面的哪些参数发挥作用受该参数的设置的影响。MIIM_BITMAP,hbmpItem将用来设置或返回按钮的位图,MIIM_ID,wID设置或返回菜单项的ID
UINT fType; 设置或返回菜单项的类型,MFT_BITMAP位图;MFT_STRING字符串;MFT_OWNERDRAW,发送WM_DRAWITEM和WM_MEASUREITEM消息用于绘制菜单项
UINT fState; 菜单项的状态:MFS_DEFAULT,默认;MFS_GRAYED,不可用;
UINT wID; 菜单项的ID,要求fMask中有MIIM_ID
HMENU hSubMenu; 下一级菜单的句柄,要求fMask中有MIIM_SUBMENU
HBITMAP hbmpChecked;
HBITMAP hbmpUnchecked;
ULONG_PTR dwItemData;
LPTSTR dwTypeData;
UINT cch;
HBITMAP hbmpItem;
} MENUITEMINFO, *LPMENUITEMINFO;
然后调用InsertMenu()函数
InsertMenu(
HMENU hMenu;
UINT nItems;
BOOL isPisition;//设为TRUE,nItems为菜单项的索引号,设为FALSE,nItems为菜单项的ID
LPCMENUITEMINFO lpmiinfo;
)
2、 修改菜单项属性使用SetMenuItemInfo()函数
3、 删除菜单项
DeleteMenu()和RemoveMenu(),菜单项删除后用DrawMenuBar()重绘菜单显示更新
四、 菜单特效
1、 快捷菜单
捕获父窗口的WM_CONTEXTMENU(用户在窗口中右击鼠标将激活该事件),调用函数
TrackPopupMenuEx();TrackPopupMenuEx(hm,
0,GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam),hWnd,NULL);hm为菜单句柄,GET_X_LPARAM(不知怎么不能用)宏获得事件发生时鼠标的X坐标,hWnd为父窗口句柄
2、 位图菜单
MENUITEMINFO结构的fMask中添加MIIM_BITMAP标志,为期hbmItem指定一个指向位图的指针
五、 自绘制菜单
1、 指定标志
要实现自绘制必须使菜单项的风格符合要求,有两种方法可以做到,其一是用InsertMenuItem()函数插入,其二是用SetMenuItemInfo()函数修改,不论使用哪一个都必须填写一个MENUITEMINFO结构,为其fMask添加MIIM_FTYPE,为其fType添加MFT_OWNERDRAW。和列表框一样,对菜单项进行自绘制是设计到较多的数据传递,可以存放在MENUITEMINFO结构中,设置fMask为MIIM_DATA,然后给dwItemData成员赋值。WM_DRAWITEM(LPDRAWITEMSTRUCT)和WM_MEASUREITEM(LPMEASUREITEMSTRUCT)的参数中都含有itemData成语用于取出预先存放的数据。
例如:
MENUITEMINFO mi;
HMENU hmn;
mi.fMask=MIIM_FTYPE;
milfType=MFT_OWNERDRAW;
hmn=GetMenu(hWnd);
SetMenuItemInfo(hmn,0,TRUE,&mi);
2、 处理WM_MEASUREITEM消息
用户单击,菜单即将显示时,菜单的父窗口接收到WM_MEASUREITEM消息,捕获此消息可以设置菜单项的尺寸,例如:
LPMEASUREITEMSTRUCT lpmis;
lpmis=(LPMEASUREITEMSTRUCT)lParam;
lpmis->itemHeight=48
lpmis->itemWidth=144;
3、 处理WM_DRAWITEM消息
WM_DRAWITEM消息的LPARAM参数为一个LPDRAWITEMSTRUCT指针,其中含有指向被绘制的菜单项的设备场景指针、菜单ID和状态等信息,根据这些信息进行绘制,例如:
LPDRAWITEMSTRUCT lpdis;
HDC hMem;
HBITMAP hbm;
hMem=CreateCompatibleDC(lpdis->hDC);
hbm=LoadBitmap(hInst,MAKEINTRESOURCE(IDB_MENUMAP));
SelectObject(hMem,hbm);
BitBlt(lpdis->hDC,0,0,lpids->rcItem.right,lpdis->rcItem.bottom,hMem,0,0,SRCCOPY);
1、 插入新的菜单项InsertMenuItem()
首先填写MENUINFO结构
typedef struct tagMENUITEMINFO {
UINT cbSize; 结构的大小,sizeof(MENUINFO)
NT fMask; 将要获得或者设置的项目,后面的哪些参数发挥作用受该参数的设置的影响。MIIM_BITMAP,hbmpItem将用来设置或返回按钮的位图,MIIM_ID,wID设置或返回菜单项的ID
UINT fType; 设置或返回菜单项的类型,MFT_BITMAP位图;MFT_STRING字符串;MFT_OWNERDRAW,发送WM_DRAWITEM和WM_MEASUREITEM消息用于绘制菜单项
UINT fState; 菜单项的状态:MFS_DEFAULT,默认;MFS_GRAYED,不可用;
UINT wID; 菜单项的ID,要求fMask中有MIIM_ID
HMENU hSubMenu; 下一级菜单的句柄,要求fMask中有MIIM_SUBMENU
HBITMAP hbmpChecked;
HBITMAP hbmpUnchecked;
ULONG_PTR dwItemData;
LPTSTR dwTypeData;
UINT cch;
HBITMAP hbmpItem;
} MENUITEMINFO, *LPMENUITEMINFO;
然后调用InsertMenu()函数
InsertMenu(
HMENU hMenu;
UINT nItems;
BOOL isPisition;//设为TRUE,nItems为菜单项的索引号,设为FALSE,nItems为菜单项的ID
LPCMENUITEMINFO lpmiinfo;
)
2、 修改菜单项属性使用SetMenuItemInfo()函数
3、 删除菜单项
DeleteMenu()和RemoveMenu(),菜单项删除后用DrawMenuBar()重绘菜单显示更新
四、 菜单特效
1、 快捷菜单
捕获父窗口的WM_CONTEXTMENU(用户在窗口中右击鼠标将激活该事件),调用函数
TrackPopupMenuEx();TrackPopupMenuEx(hm,
0,GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam),hWnd,NULL);hm为菜单句柄,GET_X_LPARAM(不知怎么不能用)宏获得事件发生时鼠标的X坐标,hWnd为父窗口句柄
2、 位图菜单
MENUITEMINFO结构的fMask中添加MIIM_BITMAP标志,为期hbmItem指定一个指向位图的指针
五、 自绘制菜单
1、 指定标志
要实现自绘制必须使菜单项的风格符合要求,有两种方法可以做到,其一是用InsertMenuItem()函数插入,其二是用SetMenuItemInfo()函数修改,不论使用哪一个都必须填写一个MENUITEMINFO结构,为其fMask添加MIIM_FTYPE,为其fType添加MFT_OWNERDRAW。和列表框一样,对菜单项进行自绘制是设计到较多的数据传递,可以存放在MENUITEMINFO结构中,设置fMask为MIIM_DATA,然后给dwItemData成员赋值。WM_DRAWITEM(LPDRAWITEMSTRUCT)和WM_MEASUREITEM(LPMEASUREITEMSTRUCT)的参数中都含有itemData成语用于取出预先存放的数据。
例如:
MENUITEMINFO mi;
HMENU hmn;
mi.fMask=MIIM_FTYPE;
milfType=MFT_OWNERDRAW;
hmn=GetMenu(hWnd);
SetMenuItemInfo(hmn,0,TRUE,&mi);
2、 处理WM_MEASUREITEM消息
用户单击,菜单即将显示时,菜单的父窗口接收到WM_MEASUREITEM消息,捕获此消息可以设置菜单项的尺寸,例如:
LPMEASUREITEMSTRUCT lpmis;
lpmis=(LPMEASUREITEMSTRUCT)lParam;
lpmis->itemHeight=48
lpmis->itemWidth=144;
3、 处理WM_DRAWITEM消息
WM_DRAWITEM消息的LPARAM参数为一个LPDRAWITEMSTRUCT指针,其中含有指向被绘制的菜单项的设备场景指针、菜单ID和状态等信息,根据这些信息进行绘制,例如:
LPDRAWITEMSTRUCT lpdis;
HDC hMem;
HBITMAP hbm;
hMem=CreateCompatibleDC(lpdis->hDC);
hbm=LoadBitmap(hInst,MAKEINTRESOURCE(IDB_MENUMAP));
SelectObject(hMem,hbm);
BitBlt(lpdis->hDC,0,0,lpids->rcItem.right,lpdis->rcItem.bottom,hMem,0,0,SRCCOPY);
- WIN32用户界面设计基础之Menus 篇
- WIN32用户界面设计基础之Cursor篇
- WIN32用户界面设计基础之Dialog 篇
- win32 用户界面设计基础之cursor篇
- WIN32用户界面设计基础之Cursor篇(转)
- VC++ WIN32用户界面设计基础之Cursor篇
- WIN32用户界面设计之Dialog 篇
- Java基础之图形用户界面的设计
- Win32 Series - Menus
- 软件工程之用户界面设计
- 软件工程之用户界面设计
- 软件设计之用户界面设计
- 软件工程之用户界面设计
- Android用户界面设计:布局基础
- Android用户界面设计:布局基础
- Android 用户界面---菜单(Menus 一)
- Android 用户界面---菜单(Menus 二)
- Android 用户界面---菜单(Menus 三)
- 端口程序
- VS2008 c++远程调试(remote debug)最简要的说明
- 程序员http://www.bo33bo.com/Movie_All.Html
- 重大决定!!
- linux串口设置工具setserial报错分析及解决方法
- WIN32用户界面设计基础之Menus 篇
- 数据库集群技术(转载)
- wince6.0下调整任务栏和工作区
- C# .net写的程序调用C++.net写的动态库装载失败,原因一句说清
- mysql优化(续)
- SQL 2005 分区表的创建方法
- 正则基础之——贪婪与非贪婪模式(转)
- ATL使用MFC类(转)
- JAVA读取资源文件的N种方法