高效实现带位图的菜单

图形用户界面GUI)编程中,自定义菜单是提升用户体验的一种方式。本文将介绍一种高效的方法来实现带位图的菜单,这种方法不仅简单易用,而且代码量小,易于维护。

在探索实现带位图的菜单的过程中,可以参考以下两篇优秀的文章:

  • "Cool Owner Drawn Menus with Bitmaps - Version 3.0" by Brent Corkum
  • "A set of classes to create the IE-styleGUI" by Nikolay Denisov

Brent Corkum的代码特别注重位图的美观,并且经过了广泛的测试和更新。然而,Corkum的方法的主要缺点是代码量较大,即使是添加位图到菜单这样简单的操作也需要大量的代码维护。

相比之下,Nikolay Denisov的方法虽然涉及的内容更广泛,但位图代码与其他代码交织在一起,独立使用较为困难。因此,基于Denisov的方法,开发了一个模块化的类,使得实现方法和Corkum的方法在设置上都很容易,但在源代码量上有显著差异。

代码量对比

以下是两种方法所需的源代码行数对比:

  • Corkum方法: 2,350行
  • 本文方法: 250行

需要注意的是,本文介绍的代码尚未经过广泛测试,仅在Windows 98下进行了测试,不适用于Windows 95/NT。

如何使用代码

要将本文介绍的代码应用到项目中,请按照以下步骤操作:

  1. 将以下文件添加到项目中:BitmapMenu.cpp, BitmapMenu.h, winuser2.h
  2. 在MainFrm.h文件顶部添加以下代码:#include "BitmapMenu.h"
  3. 在MainFrm.h文件中,让主框架窗口继承自BitmapMenu而不是CFrameWnd或CMDIFrameWnd。例如:
  4. class CMainFrame : public BitmapMenu<CFrameWnd> { // ... };
  5. 在MainFrm.cpp文件中,在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间添加三个消息处理器:
  6. ON_WM_INITMENUPOPUP() ON_WM_MEASUREITEM() ON_WM_DRAWITEM()
  7. 在MainFrm.cpp文件的CMainFrame::OnCreate()函数末尾添加想要出现在菜单中的每个工具栏:
  8. AddToolBar(&m_wndToolBar);

示例代码

// 在MainFrame的构造函数中初始化BitmapMenu CMainFrame::CMainFrame() { // 初始化BitmapMenu m_bmpMenu.LoadBitmap(IDB_MENUBAR); } // 在OnCreate中添加工具栏 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; // 添加工具栏 AddToolBar(&m_wndToolBar); // 其他初始化代码... return 0; }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485