来自 XML 配置文件动态菜单和工具栏






2.76/5 (12投票s)
本文介绍了一个解析 XML 配置文件并动态创建菜单和工具栏的应用程序。
引言
本文的主要目的是展示通过解析 XML 配置文件动态创建菜单和工具栏的另一个方面。在 MFC 中,每当需要使菜单和工具栏控件动态化时,我们常常会卡在定义菜单和工具栏方法的环节上。
本文将展示一个使用 **VC++** 编写的代码示例,其中我使用 **MFC** 和 **GDI** 创建了动态的 **菜单** 和 **工具栏**。我选择 **XML** 文件作为此应用程序的配置文件。菜单项和工具栏项的命令消息可以根据用户选择的任务映射到相应的函数。
背景
作为 MFC 开发者,您可能知道,要创建动态控件,您需要假定一个常量(Resource_ID)。您还必须在 **BEGIN_MESSAGE_MAP()** 中指定 **ON_COMMAND(RESOURCE_ID, methodName)** 和 **ON_BN_CLICKED (RESOURCE_ID, methodName)**。当用户单击菜单或工具栏中的项时,将调用相应的函数。
您将有机会在 CMainFrame::CmdMap() 函数中使用我的代码,通过委托来重新定义和映射事件,以实现更动态的环境。如果您了解 .NET,那么您一定熟悉委托——即函数指针——它们在为任何控件定义特定方法方面起着重要作用。您可以使用委托指向函数,以处理相应的菜单和工具栏项事件。
这次,我只涵盖了 MFC 的 ON_COMMAND() 和 ON_BN_CLICKED() 方面以及我的消息映射。我已经定义了我自己的消息映射,并根据需要为控件分配了值。未来我将尝试展示 MFC 事件委托的示例,以便它能更灵活地处理事件。
程序说明
本文中的程序名为 **XmlMenuApp**。XmlMenuApp 是一个通过解析 XML 文件中的配置项,在当前窗口中绘制菜单和工具栏的程序。该程序使用 VC++ 语言在 Visual Studio 2005 中开发。
在此应用程序中,配置文件名为:“MenuToolBarConf.xml”
用户可以根据用户对菜单和工具栏项的要求,在 xml 文件中进行必要的更改。
菜单和子菜单项遵循“menuentry”标签
工具栏按钮名称遵循“toolbarentry”标签
工具栏图像路径遵循“imgpathentry”标签
注意:位图图像名称应与工具栏按钮名称相同。用户必须为工具栏按钮指定图像路径条目。如果某个工具栏按钮的图像未
找到,程序将停止运行。
例如:位图图像路径示例:“E:\\Projects_VS\\Dyn_image\\”
在这里,我们为应用程序的工具栏按钮图像使用了“Dyn_image”文件夹。
使用代码
我已尽力使我的代码具有高度的可读性和清晰性。以下提示将帮助您非常清楚地理解代码。请下载代码并按照以下架构进行查看。
以下类是程序的主要控制器
---------------------------------------------------------------
1. CXmlMenuToolBarApp
2. CMainFrame
以下类是程序的 XML 文件解析器
---------------------------------------------------------------
3. CXmlElement
4. CXmlDocument
以下类用于创建程序的菜单和工具栏
---------------------------------------------------------------
5. CXmlMenu
6. CXmlToolBar
以下类用于查看程序的工具栏按钮
---------------------------------------------------------------
7. CXmlToolBarView
---------------------------------------------------------------
模型类尚未实现,因为尚未为菜单和工具栏项定义操作。操作可以从控制器映射到模型类的成员函数。
注意: 附加的压缩文件包含以下内容:
- 源代码
- 此应用程序使用的位图图像文件夹
- ReadMe.txt
请重新构建程序以运行。
- 联系信息
- 如果您想添加新图像,Visual Studio 安装驱动器上的以下路径可能会有所帮助:
- “\Program Files\Microsoft Visual Studio 8\Common7\VS2005ImageLibrary”
- 建议您使用 16 位和 24 位位图图像作为工具栏按钮。
此项目的用户可能会遇到一些意外(但不严重)的内存泄漏。我请求用户将这些情况作为家庭作业来处理。此外,我正在修复这些问题,并将尽快更新本文。
关注点
该项目基于 MFC 和 GDI 开发。在 **CXmlToolBarView::OnPaint()** 函数中,我使用了 TransparentBlt() 函数来透明地绘制工具栏按钮图像,并且透明颜色在此处硬编码为 RGB(255,0,255)。
// CXmlToolBarView painting bitmap from file into dest dc void CXmlToolBarView::OnPaint(CDC *dc, CDC *dcMem, LPCTSTR szFilename, int x, int y) { CBitmap *bmpSrc = new CBitmap; CBitmap *bmpSrcOld = new CBitmap; CDC dcMemSrc; //load bitmap from file !this->LoadBmp(bmpSrc, szFilename); dcMemSrc.CreateCompatibleDC(dc); bmpSrcOld = dcMemSrc.SelectObject(bmpSrc); // transparent blit to the dest. as the megenda has been the transparent color dcMem->TransparentBlt(x,y,16,16,&dcMemSrc,0,0,16,16,RGB(255,0,255)); //holds previous state of the dc dcMemSrc.SelectObject(bmpSrcOld); dcMemSrc.DeleteDC(); //if image not loaded successfully then follwing lines prevent some illeagal operation if(bmpSrcOld) bmpSrcOld->DeleteObject(); }
网站仍在建设中...
致谢
致谢:我非常感谢 Shahadatul Hakim 先生和 Mukit 先生为我提供了可以研究的主题。
我要感谢 KTS INFOTECH PVT LTD. 的 Tom Thomas 先生,他帮助我解决了此项目中的一些问题。
在解析 XML 文件方面,我要感谢 John Melas。XML 文件处理代码来自 Pablo van der Meer。在将代码移植到项目中进行了一些定制。
我还要感谢 Rodolfo Ortega 先生对 Code Project 的贡献,他的文章“如何创建动态工具栏”为我提供了灵感,我定制了他的代码使其更加动态。
对于此处使用的 GDI 代码,我参考了 Chris Becke 的“Bitmap Basics - A GDI tutorial”。