二、编程步骤
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 //该结构用存放菜单自绘时所需要的信息; { CString strText; //菜单项的文本; UINT uID; //菜单的ID标识号; UINT uIndex; //菜单项所要画的图标在工具条图标序列中的索引号; int uPositionImageLeft; //当前菜单项在纵向菜单中的位置; }MENUITEM; typedef MENUITEM * LPMENUITEM; ////////////////////////////////////////////////////////////// class CMenuEx : public CMenu { public: void InitPopupMenu(CMenu *pPopupMenu,UINT uToolBar,CToolBar *pToolBar); void ChangeStyle(CMenu *pMenu,CToolBar *pToolBar,BOOL bIsMainMenu=FALSE); void SetHighLightColor(COLORREF crColor); void SetBackColor(COLORREF); void SetTextColor(COLORREF); void SetImageLeft(UINT idBmpLeft); void MeasureItem(LPMEASUREITEMSTRUCT lpMIS); void InitMenu(CMenu *pMenu,UINT uToolBar,CToolBar *pToolBar); void DrawItem(LPDRAWITEMSTRUCT lpDIS); CMenuEx(); virtual ~CMenuEx();
protected: int m_nSeparator; CSize m_szImageLeft; //纵向位图尺寸; CBitmap m_bmpImageLeft; //纵向位图对象; int m_nWidthLeftImage; //纵向位图的宽度; BOOL m_bHasImageLeft; //是否有纵向位图 BOOL m_bInitial; //菜单是否已初始化,即设定了自绘风格 int GetImageFromToolBar(UINT uToolBar,CToolBar *pToolBar,COLORREF crMask=RGB(192,192,192)); //从工具条中获取图标信息; CList |
四、小结
到此为止,本例详细介绍了菜单自绘类CMenuEx的实现以及它在应用程序的具体使用方法,相信读者能够从中学习到菜单的自绘制机理。本例中的CMenuEx类稍加改动,就可以实现各种不同类型的菜单效果,如WindowsXP风格的菜单等。 
说明:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
2/2 首页 上一页 1 2 |