第六节 HelloWorld讲解
看完上一节,大家应该已经能够做出一个最简单的插件了,但是原理可能还不是很清楚,这一节将对HelloWorld进行详细讲解。HelloWorld的编写虽然有多个步骤,但大部分都是.Net开发的基本知识,熟悉.Net开发的人不会有问题。关键是两个地方需要讲解:
1、插件描述文件(HelloWorld.Addin):
Micaps使用Addin文件对插件的参数进行定义,如果是要给Micaps菜单添加菜单项,那么首先要在参数里指定菜单添加位置和菜单名,其次要指定一个类来响应该菜单项单击后的动作。
插件描述文件前面讲SharpDevelop时已经提过,主程序在启动后会读取它,将它加入插件树中,然后根据插件树的扩展点创建不同部件,实现不同功能。
HellowWorld.Addin中,各部分含义如下:
Name: 插件名称
Author: 作者
url: 超链接
description: 插件描述信息
以上对插件做了描述性表述,内容可根据情况填写,填写可以随意。
=======================================================
<Runtime>
<Importassemble = “HellWorld.dll”/>
<Runtime>
该段定义插件的dll文件名,如果Addin与dll在同一路径,dll可省略路径名。
=======================================================
<Path name = "/Workspace/MainMenu/View">
<MenuItem id ="HelloWorldCommand"
label = "Hello World"
class = "HelloWorld.HelloWorldCommand"/>
</Path>
Path name: 表示你的插件所要插入的扩展点,它决定着你的插件要扩展的功能(Micaps内部已经定义了如主菜单、主工具条、浮动窗口、视图等节点,一般情况下,我们只需要根据需要添加的功能将插件的PahtName设为适当值)。如:Path name = "/Workspace/MainMenu/View"表示给Micaps的主菜单增加内容。常用扩展点如下(Copy自Micaps二次开发手册):
扩展点路径 | 元素 | 属性 | 备注 | 示例 |
/Workspace/DisplayBindings | DisplayBinding | 1、id:标识binding 2、class: IDisplayBinding 或ILayerDisplayBinding接口的实现类 3、type[可选]:如果class是从layerdiplaybinding,则需要type属性等于”Layer” | 这里class的名称要使用全名称即 namespace+classname | <Path name = “Workspace/DisplayBinding> <DisplayBinding id=”diamond14” class=”Diamond14.Diamond14FileDisplayBinding” type=”Layer” /> </Path> |
/Workspace/MainMenu | MenuItem | 1、id:菜单id 2、label:菜单文字 3、type:菜单类型 4、icon:菜单图标 5、shortcut:快捷键 6、class:点击菜单要执行的命令 7、param[可选]:执行菜单时,传递给命令接口execute方法的参数。 | type类型可以为 command:普通的按钮菜单 separate:菜单分割条 menu:当前菜单是父级菜单 | <MenuItem id=File label=”文件” type=”menu”> <MenuItem id=”new” type=”command” lable=”新建” class=”Micaps.NewFileCommand”/> </MenuItem> |
/Workspace/ToolWindows | ToolWindow | 1、id:windowid 2、class:继承自IToolWindow的实现类。 3、icon[可选]:图标 4、title:窗口标题 5、defaultposition[可选]:默认位置 6、category:是否在主系统的视图菜单中添加显示该窗口的菜单项 | 或者继承abstract defaultposition:是 top、buttom、left,right,如果默认不显示,则用逗号隔开用hidden. category属性:有些工具窗口默认是不显示。一般都需要在菜单中增加一个显示窗口的菜单。可以把这个属性设置为“Main“ | <ToolWindow id=”Diamond14PropertyWindow” class=”Diamond14PropertyWindow” title=”14类属性” defaultposition=”Left,Hidden” category=”Main”/> |
/Workspace/Toolbar | ToolbarItem | 同菜单 | toolbaritem元素的属性和菜单基本一样,只是type中多一些类型,工具栏类型可以是Separator、 Checkbox、 ComboBox、 DropDownButton、 SplitButton | <ToolbarItem id=”SaveImage” label=”保存图片” class=”Micaps.SaveImageCommand” shortcut=”Ctrl+S”/> 工具栏如果指定了图片,则不显示文字了 |
/Workspace/Autoload | Class | id:命令id class:继承自ICommand接口的实现类 |
| <Class id=”showmainview” class=”Micaps.ShowMainViewCommand”/> |
/Workspace/Toolbox | TooboxItem | id:交互工具id class:点击交互工具要执行的命令 label: 交互工具名称 icon:图标 hasproperty:是否具有属性 |
| <ToolboxItem id=”yijifeng” lable=”一级风” icon=”BitMaps.Yijifeng” hasproperty=”false” class=”Diamond14.DrawSymbolCommand”/> |
/Workspace/MainView /AutoloadLayers | Class | id:节点标识 class:继承自Layer类的实现 |
| <Class id=”interactivelayer” class =”Diamond14.InteractiveLayer”/> |
不同扩展点,其子节点的内容各不相同,如HelloWorld挂接在主菜单节点下,因此它的子节点应为MenuItem,对于MenuItem,它必须要有两个属性,一个是Lable,即菜单项的标题,另一个是要执行这个菜单命令的类class,它是你的插件代码中的一个类名称,并且这个必须继承AbstractMenuCommand。
Micaps本身的主菜单、主工具条、浮动窗口等都是以这种方式添加进来的,也就是说Micaps开发人员也是用这种方式给Micaps添加各个窗口部件,所以,我们可以在Micaps/Addin目录及其子目录下找到大量Addin文件,这些文件可以作为编写新插件很好的参考。
2、代码
前面我们说了,Addin文件中设定一个按钮执行类HelloWorld.HelloWorldCommand,所以代码中必须对它进行实现,该类必须继承抽象类AbstractMenuCommand。在Sharpdevelop源码中查看AbstractMenuCommand定义如下:
public abstract class AbstractMenuCommand : AbstractCommand, ICommand, IMenuCommand { protected AbstractMenuCommand(); public virtual bool IsEnabled { get; set; } public override bool CanExecute(object arg); }
它由AbstractCommand继承,并实现了ICommand, IMenuCommand接口。再看AbstractCommand,定义如下:
public abstract class AbstractCommand : ICommand { protected AbstractCommand(); public virtual object Owner { get; set; } public event EventHandler OwnerChanged; public abstract bool CanExecute(object arg); public abstract void Execute(object arg); protected virtual void OnOwnerChanged(EventArgs e); }
先不管这么多,只需要知道其中抽象函数Execute(object arg)未被实现,这个就是等你实现的菜单项单击后要执行的函数。
于是,代码就出来了:
/// HelloWorld菜单命令类 /// </summary> public class HelloWorldCommand : AbstractMenuCommand { /// <summary> /// 点击HelloWorld菜单后被调用 /// </summary> /// <param name="arg"></param> public override void Execute(object arg) { MessageBox.Show("Hello World 欢迎使用Micaps3.2二次开发教程!"); } }
实际上就一行代码,用来验证代码是否生效。
总结一下,要给Micaps增加菜单项,首先在Addin文件中,标明扩展点路径为/Workspace/MainMenu(主菜单扩展点)、菜单的名称、执行该菜单的类名等,然后在代码实现Addin中设定的类,该类要继承AbstractMenuCommand,实现抽象方法Execute,在该方法中编写单击按钮所要执行的代码,运行Micaps后即可生效。
3、插件的发布
编写完插件,给其Micaps用户用,很简单:将你编译好的dll和Addin文件,拷入一个文件夹,别人要用,将此文件夹拷入Micaps3.2的Addins目录下,然后修改此目录下的Micaps.Config文件,将拷入的Addin文件名加进去,重写运行Micaps,插件即可生效。
本节仅针对HelloWorld实例进行了讲解,要了解SharpDevelop插件是如何组织、加载、运行的原理,需认真阅读SharpDevelop文档和源码。