WEB开发网
开发学院软件开发VC 完美实现真彩自绘菜单 阅读

完美实现真彩自绘菜单

 2008-01-19 20:23:56 来源:WEB开发网   
核心提示:一、提出问题在VCKBASE上读到《自绘菜单的实现》[作者:querw],应用的我自己的正在进行的工程后发现效果不错,完美实现真彩自绘菜单,可是有存在许多问题,整个类的设计方面存在很多缺陷(先天,当CMenuEx派生于CMenu,并且重写这两个虚拟函数以后,后天的),存在的主要问题如下: 当应用在多文档界面(M

一、提出问题

在VCKBASE上读到《自绘菜单的实现》[作者:querw]。应用的我自己的正在进行的工程后发现效果不错,可是有存在许多问题。整个类的设计方面存在很多缺陷(先天,后天的),存在的主要问题如下:

  1. 当应用在多文档界面(MDI)中的时候,无法对系统自动添加菜单和文档模板菜单进行自绘(比如无法对文件->最近文件(MRU)菜单项中的文件列表就是系统自动添加)。原因是类内部没有对CMainFrame::OnInitPopupMenu()消息进行处理的函数, 因此不具备修改系统自动添加菜单项的功能。(BCMENU有这功能,而且工作的不错)
  2. 作者提到的 BCMENU 不用映射 WM_DRAWITEM 和 WM_MEASUREITEM 两个消息就能实现自画功能,实际上是错误的。不映射这两个重要的消息,即使能自绘,也是有问题的,不信看图。

    菜单编辑器中的模菜单样

    使用BCMENU并且映射了这两个消息后的执行情况

    使用BCMENU没有映射两个消息的执行情况

    原作者分析的自绘的是因为把主菜单(top-level menu)的子菜单都加载成弹出菜单(popupmenu),是不正确的。真正的原因是因为MFC框架会自动调用CMenu的两个虚拟函数MeasureItem()和OnDrawItem()。 因此,当CMenuEx派生于CMenu,并且重写这两个虚拟函数以后。

    1、MFC框架调用的GetMenu()->MeasureItem()就相当于调用了CMenuEx::MeasureItem(),从而实现自绘菜单控件尺寸的测量。

    1 2 3 4  下一页

Tags:完美 实现 真彩

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接