zoukankan      html  css  js  c++  java
  • 巧用boost库实现字符串映射消息处理函数


    作者:朱金灿
    来源:http://blog.csdn.net/clever101/


          Boost库实在是一个博大精深的库。经过实验,我发现巧用boost::bind和boost::function可以实现一些巧妙的设计。


         编写过MFC程序的朋友都知道,通过资源编辑器编辑菜单项,设定菜单项ID,然后MFC内部通过该ID来映射菜单命令处理函数和菜单界面更新函数。我设想撇开MFC的资源编辑,在MFC程序中通过xml文件来进行界面配置,然后利用字符串来映射消息处理函数。借助boost库,我实现了这一设想。具体就是在xml文件指定一个字符串,然后通过这个字符串就能找到它的命令消息处理函数和界面更新命令消息处理函数。


         下面具体谈谈怎么实现这一设想。我需要解决的是两大问题:一是通过xml文件来动态创建界面;二是根据xml文件里指定的菜单项字符串找到它的命令消息处理函数。


          第一个问题相对简单。首先我谈谈我的系统界面配置xml文件的设计。我的系统界面配置xml文件比较简单,具体如下:



         简单解释就是:Framework节点保存的是程序的基本信息,包括包含了程序名、公司名和公司网址;接着就是UIDescription--界面描述,主要包括全部菜单栏信息和菜单项信息。


       对应这个系统配置xml文件,我们需要在程序中定义相应的结构体,具体如下:



         程序定义了一个基于tinyxml库的xml文件解析类CXmlParse,关于如何解析xml文件本博客已经有过详细介绍,具体参考如下文章:
    TinyXml快速入门(一)

    TinyXml快速入门(二)

    TinyXml快速入门(三)

    就TinyXml使用答复一位网友

    将TinyXml快速入门的接口面向对象化


         具体做法是在应用程序类里定义两个变量:



         在程序初始化实例函数InitInstance()里调用CXmlParse类的接口来解析系统配置文件。根据解析系统xml文件来动态创建菜单栏的代码也比较简单,集中在GetAllmenubar和MainMenubarCreate两个函数,具体见上传的代码,这里不作赘述。


         下面我具体谈谈如何通过xml文件中指定的菜单ID字符串来映射它的消息处理函数,概括来说是通过一个函数来实现的。



    在框架类里定义一个map,菜单ID作为键,消息处理函数指针作为键值:


       


        然后在创建菜单的时候将消息处理函数指针添加进这个map:



         最后重载框架类的OnCmdMsg函数,根据菜单ID值调用map里的函数:



    程序用到的第三方库包括:tinyxml 2.5.3和boost 1.34。相关源码已上传到联合程序开发网:boost库测试下载 。程序界面如下:


    boost library test





























  • 相关阅读:
    【webrtc】创建https服务(7)
    【python驱动】python进行selenium测试时GeckoDriver放在什么地方?
    python下载后出现python 已停止工作
    python版本下载时时,官方目录web-based与executable和embeddable 的区别
    python下pip 安装 pyautogui报错Command "python setup.py egg_info" failed with error code 1 in C:UsersAdministratorAppDataLocalTemppip-install-svhtephopygetwindow
    python踩坑记录篇,持续更新
    坑:jmeter代理服务器录制脚本出现target controller is configured to "use recording Controller" but no such controller exists...
    jmeter+ant+jenkins构建自动化测试
    linux环境下固定ip操作
    pychram编写代码鼠标变粗处理
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6471063.html
Copyright © 2011-2022 走看看