自绘菜单的实现
2008-01-19 20:24:00 来源:WEB开发网核心提示:CMenuEx::LoadToolBar(UINT uToolBar, UINT uFace)接口,请注意它的两个参数:uToolBar 是工具条的资源,自绘菜单的实现(2),uFace 是一个替代位图的资源ID,因为VC6.0中做一个真彩工具栏并不是一件容易的事,所以我做了一个小动作:用IDE的资源编辑器随便编辑一个
CMenuEx::LoadToolBar(UINT uToolBar, UINT uFace)
接口,请注意它的两个参数:uToolBar 是工具条的资源,uFace 是一个替代位图的资源ID。因为VC6.0中做一个真彩工具栏并不是一件容易的事,所以我做了一个小动作:用IDE的资源编辑器随便编辑一个工具条,只要ID和菜单ID相对应即可,然后可以用外部编辑器编辑好真正要使用的位图(顺序和工具条资源的顺序一样),并把该位图作为uFace参数传入,菜单就可以有真彩图标了。
CMenuEx还提供了如下三个接口:
BOOL ModifyMenuEx()
BOOL AppendMenuEx()
BOOL RemoveMenuEx()
功能一目了然,只是增加了对自绘风格的处理,应用的时候只要像调用普通的CMenu::AppendMenu()等函数一样就自动拥有自绘风格了。我写这篇文章的目的在于提出菜单派生类调用 MeasureItem() 和 DrawItem()的问题。至于实现漂亮的菜单界面主要工作当然还是在 DrawItem() 函数中做,有特殊需要的可以自行定义 MENUITEM 结构,重新写 DrawItem() 函数。我没有提供设置菜单附加位图的具体代码,相信这个不是问题。你可以很容易的通过重写 DrawItem()实现。有必要提醒的是:有关一个菜单项的信息最好能完全从一个MENUITEM结构中取得,使
virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMIS);
virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS);
两个函数完全不依赖于CMenuEx类的数据成员。
要在工程中使用CMenuEx很简单:
- 把MenuEx.h和MenuEx.cpp加入到你的工程中;
- 声明一个CMenuEx对象.例如m_Menu;
- 调用m_Menu.LoadMenu(IDR_MENU1),读入菜单;
- 若需要使用菜单位图则调用m_Menu.LoodToolBar();
效果如下:
主菜单
弹出式菜单
最后,对《一种漂亮的自绘菜单》的作者郑恒给予我的帮助表示衷心感谢!
更多精彩
赞助商链接