Visual C++中自绘菜单的实现(3)
4、int GetImageFromToolBar(UINT uToolBar, CToolBar *pToolBar,COLORREF crMask)
说明:这个函数用来从工具条上获取相应图标。
5、void ChangeStyle(CMenu *pMenu,CToolBar *pToolBar,BOOL bIsMainMenu)
说明:这个函数用来修改菜单pMenu的类型为"自绘制"
6、void DrawMenuItemImage(CDC *pDC,CRect &rect,BOOL bSelected,BOOL bChecked,BOOL bGrayed,BOOL bHasImage,LPMENUITEM lpItem);
说明:这个函数根据菜单的不同状态及包含的各种信息,对菜单进行绘制;
上述函数构成了CMenuEx类的主要骨架,该类还有一些实现辅助函数,它们分别是:
1、void SetHighLightColor(COLORREF crColor); //设置菜单搞亮显示;
2、void SetBackColor(COLORREF); //设置菜单的背景颜色;
3、void SetTextColor(COLORREF); //设置菜单的文本颜色;
4、void GrayString(CDC *pDC,const CString &str,const CRect rect); //显示灰色菜单文本;
5、void TextMenu(CDC *pDC,CRect &rect,CRect rtText,BOOL bSelected,BOOL bGrayed,LPMENUITEM lpItem); //显示菜单上的文本;
CMenuEx类在使用过程中,要注意对其初始化,对于主框架菜单,可以在CMainFrame类的WM_INITMENU消息响应函数中实现,为了激活菜单的自绘功能, 需要在CMainFrame类的WM_DRAWITEM和WM_MEASUREITEM中分别调用CMenuEx类的DrawItem()函数和MeasureItem()函数。对于上下文菜单的实现,有两种方法,一种方法是在项目视图类的WM_INITMENUPOPUP响应函数中调用InitPopupMenu()函数来修改菜单的类型,然后在WM_CONTEXTMENU响应函数中调用CMenu::TrackPopupMenu()函数显示上下文菜单;另一种方法是直接响应鼠标的右键单击消息,在响应函数中处理鼠标的初始化和显示。第二种方法处理上下文菜单比较常用,这方面的资料也很多,就不在赘述了。为了让读者朋友们更深入的了解上下文菜单的处理,例子中使用了第一种方法。
二、编程步骤
1、 启动Visual C++6.0生成一个单文档应用程序框架,去除文档支持,将应用程序命名为Hello;
2、 在CMainFrame类中添加CMenuEx类的成员变量m_menu;
3、 使用Class Wizard在CMainFrame类添加WM_INITMENU、WM_DRAWITEM、WM_MEASUREITEM消息响应函数、在ChildView类中添加WM_INITMENUPOPUP、WM_CONTEXTMENU消息响应函数;
4、 将需要显示图标的菜单的ID识别号与工具条上响应的按钮的ID识别号统一起来;
5、 在CChildView类中添加成员变量CToolBar * m_pToolBar和 CMenuEx m_menu。m_pToolBar对象主要是用来存放程序中的工具条,从而提供给上下文菜单m_menu自画时所需要的图标信息。
6、添加代码,编译运行程序。
三、程序代码
//////////////////////////////////////////////CMenuEx类的文件
#if !defined(AFX_MENUEX_H__FE677F6B_2315_11D7_8869_BB2B2A4F4D45__INCLUDED_)
#define AFX_MENUEX_H__FE677F6B_2315_11D7_8869_BB2B2A4F4D45__INCLUDED_
#include "afxtempl.h"
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
typedef struct tagMENUITEM //该结构用存放菜单自绘时所需要的信息;
{