前边有几篇文章专门讲述了对插件框架的设计,本文将主要讲述如何建立一个稍微看上去像个样子点的插件系统示例。
目标系统描述
该系统为用户提供了简单的常用功能,类似于一个简单工具包,每个工具包是一个插件。系统启动后自动缩小到系统托盘,在系统托盘的图标上点击鼠标右键弹出菜单,用户通过菜单选择使用某功能。
设计思路
首先,我们需要一个系统主插件,该插件实现了最小化,并响应鼠标右键,当然最关键的是要提供特殊的接口让其它插件注册菜单。
其次,为了系统演示的完整性,我们还需要设计两个简单的小插件,如果能够有价值是最好的了。
实施步骤
1、 当前是命令行插件加载器,会有命令行窗口出现,现在需要更换其它方式,或做某些修改,最终使得不能出现命令行窗口,或其它窗口。
2、 确定主插件接口;
3、 实现最小化;
4、 实现右键菜单的处理;
5、 实现菜单的注册处理;
6、 编写测试小工具插件;
第一步:
我认为最简单的方法就是写一个Win32加载器,不要创建界面即可,这个步骤即可完成。
过程也非常简单,创建一个默认的Win32工程,然后调用插件核心入口即可。完成后我进行了测试,确实与我预期的一致。
这一步太简单了。
第二步:
当前我们可以预期的只是注册菜单,所以也只需要提供注册菜单的插件即可。插件接口定义如下:
typedef void(*MenuFun )(void);
class MainMenuPlugin : public Iplugin
{
public:
// 注册插件菜单
// [In]
// strName: 菜单显示名称
// fun: 菜单被点击后的处理函数
// [Return]
// 为菜单分配的唯一ID
virtual int RegMenu(std::string& strName,MenuFun fun) = 0;
};
系统主插件实现该接口,其它子工具插件在初始化时,获取主插件,并注册自身的菜单即可。
第三步:
虽然我有实现过最小化的程序,但基本很少是我查找API,然后再实现,一般都是从网上搜索现成的实现,拿来用用。对于这样的态度,大家就不要评论了,毕竟是有好有坏。
这个部分需要注意的地方就是,一般来说最小化后鼠标左键是重新显示界面,我们这里鼠标左键仅仅弹出类似版权信息的对话框。
关于这个问题我的做法是建立一个Win32链接库的工程,在主插件运行时建立一个隐藏的窗口,然后建立最小到托盘的图标。
具体参考的代码:http://blog.chinaunix.net/space.php?uid=20561780&do=blog&cuid=542386
第四步:
有了前边的基础,我们现在就可以进行动态菜单的建立了。在进行动态菜单的创建之前,有必要看下具体的创建过程:
hMenu=CreatePopupMenu();;
AppendMenu(hMenu,MF_STRING|MF_POPUP,IDM_EXIT,"ExitXXX");
对于子插件需要注册的菜单,我们只需要将子插件的注册项与一个默认的菜单ID关联起来即可。例如,子程序注册菜单“测试1“,我们自动分配一个ID给该菜单,当消息循环中该菜单被激活,那么就执行子插件注册的菜单处理函数。
第五步:
为了进行菜单的注册,我们在第二步中提供了新的插件接口。现在只需要实现该接口,并与第四步的操作进行整合,即可完成。
一切顺利,结果与预期一致。
第六步:
现在还没有想好写什么样的简单工具,所以现在仅仅是弹出一个对话框进行测试,工程名称为TestTool1,有兴趣的朋友可以参照此插件提供更好的小工具插件,所有插件都将会添加到此工程下,希望以后可以更加繁荣。
我会在后续中把写好的小工具插件发布出来,不管是设计,还是插件都希望能够给大家帮助。
此版本的源码下载: