当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 一种漂亮的自绘菜单

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 一种漂亮的自绘菜单


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 51 ::
收藏到网摘: n/a

一种漂亮的自绘菜单
作者:郑恒 (lbird)

下载本文示例工程

以前还是菜鸟时就觉得QQ的菜单做得很漂亮,想着自已的程序如果有那种菜单多好。
现在积累了一定的知识,就自已设计了一个类似的菜单控件类。并把它发表出来供大家使用和参考,难免有不足的地方请高手不吝赐教!
菜单效果如下:


一、CMenuEx菜单类主要接口函数:

1、void InitMenu(CMenu *pMenu,UINT uToolBar,CToolBar *pToolBar);
说明:这是最主要的一个接口。如果要改变主窗口的菜单则应在主窗口的OnInitMenu(CMenu *pMenu)中调用该函数(如:m_menu.InitMenu(pMenu,IDR_MAINFRAME,&m_wndToolBar)),当然主窗口必须要有工具栏,才会产生菜单项位图。最后还必须重载主窗口的OnMeasureItem()和OnDrawItem()。并在两个函数中分别
调用菜单类的另外两个接口DrawItem()和MeasureItem();

2、void SetHighLightColor(COLORREF crColor);
3、void SetBackColor(COLORREF);
4、void SetTextColor(COLORREF);
以上三个接口应该不用再说明 。

QQ的菜单采用的颜色是
SELECTTEXT_COLOR RGB(0,0,127)
TEXT_COLOR RGB(0,0,0)
BK_COLOR RGB(143,167,207) 效果不错

5、void SetImageLeft(UINT idBmpLeft)
说明:这也是个重要的接口。要实现纵向位图(像“开始”菜单)。可以在适当的地方调用该函数。参数当然是位图的ID值。注意选择位图时要选好看一点的哦!要记得高宽的比例。
6、void InitPopupMenu(CMenu *pMenu,UINT uToolBar,CToolBar *pToolBar)
与InitMenu不同的是:InitMenu并不修改第一级菜单为自绘风格,而
该函数有包括第一级菜单.
但必须注意:该类的任一实例都只能调用这两个函数中的一个,不能一同使用!!!

二、CMenuEx类的具体使用步骤:

2.1 用CMenuEx类加载主窗口菜单的具体步骤:

1、添加CMenuEx成员变量
CMenuEx m_menu
2、CMainFrame类添加WM_INITMENU消息,并在实现函数中加入代码:
m_menu.InitMenu(pMenu,IDR_MAINFRAME,&m_wndToolBar);
IDR_MAINFRAME是工具栏资源ID,m_wndToolBar是工具栏对象
3、CMainFrame类添加WM_DRAWITEM和WM_MEASUREITEM消息,并在实现函数分加入:
if(!nIDCtl) m_menu.DrawItem(lpDrawItemStruct);if(!nIDCtl) m_menu.MeasureItem(lpMeasureItemStruct);
只须这三步就大功造成了!
但是有时你会发现菜单的位图错位了,这不是程序的错。
这是因为“工具栏位图”的个数与“工具栏按钮个数”不符,
你只需把不用的位图删掉就可以,或者添加对应的菜单项,反正使这两个数目一致就对了

4、如果你想要让你的菜单拥有“纵向位图”(像“开始”菜单),就必须在CMainFrame在OnCreate()中加入:
m_menu.SetImageLeft(IDB_BITMAP1);//IDB_BITMAP1是指定位图
2.2 用CMenuEx类加载弹出菜单的具体步骤:

1、在CChildView类中加入成员变量 CMenuEx m_menu和CToolBar *m_pToolBar
为什么要加入m_pToolBar,这里做一下说明:
因为在CMenuEx的接口函数InitPopupMenu()中需要工具栏对象指针,而工具栏对象又偏偏是CMainFrame类的成员
所以设此指针变量指向工具栏对象

2、给CChildView类的成员m_pToolBar赋值。
当CView派生类由不得CxxxxDocTemplate产生时,赋值的地方比较特殊
请在CxxxWinApp类中的InitInstance()的最后加入代码:
CMainFrame *pFrame=(CMainFrame *)m_pMainWnd;	CChildView *pView=(CChildView *)pFrame->GetActiveView();	pView->m_pToolBar=&(pFrame->m_wndToolBar);//注意:原m_wndToolBar是私有变量,要改成public的哦!
当CView派生类是CMainFrame类的成员变量时,就很简单,直接在OnCreate()中设置

3、在CChildView的构造函数中加入设置弹出菜单的代码
m_menu.CreatePopupMenu();	m_menu.AppendMenu(0,ID_EDIT_UNDO,"撤消");	m_menu.Append