龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

Visual C++中自绘菜单的实现(3)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
4、int GetImageFromToolBar(UINT uToolBar, CToolBar *pToolBar,COLORREF crMask) 说明:这个函数用来从工具条上获取相应图标。 5、void ChangeStyle(CMenu *pMenu,CToolBar *pToolBar,BOOL

  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 //该结构用存放菜单自绘时所需要的信息;
{

精彩图集

赞助商链接