Micaps3.2二次开发实例教程-6

第六节        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文档和源码。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Micaps3Micaps4都是气象数据交换格式,区别在于Micaps3是文本格式,而Micaps4是二进制格式。Micaps4格式拥有更好的压缩效率和更高的数据安全性,因此在数据传输和存储时更加优秀。 ### 回答2: Micaps是中央气象台研制的气象数据交换格式,便于不同气象系统之间的数据共享和传输。Micaps3Micaps4是两种常见的Micaps数据格式。 首先,两种格式在数据存储方式上有所区别。Micaps3采用的是二进制数据存储方式,即将数据以二进制形式存储在文件中,减小了文件体积,并且读取速度较快。而Micaps4采用的是文本数据存储方式,将数据以可读的文本形式存储,方便人工查看和编辑。 其次,两种格式在数据结构上也有不同。Micaps3采用时次-层次-要素的三维数据结构,即通过指定时次、层次和要素来定位数据,例如地面观测数据、雷达回波数据等。而Micaps4采用时次-层次-区域的三维数据结构,即通过指定时次、层次和区域来定位数据,例如数值预报产品、格点数据等。Micaps4的数据结构更加灵活多样,适用范围更广。 此外,两种格式在数据支持程度上也存在差异。Micaps3作为较早的格式,支持的气象要素相对较少,主要包括温度、湿度、气压等基本要素。而Micaps4作为更新的格式,增加了更多的气象要素,涵盖了温度、湿度、风速、降水量、云量、能见度等更为细致的要素。 综上,Micaps3格式与Micaps4格式的区别主要包括数据存储方式、数据结构和数据支持程度。Micaps3采用二进制存储,数据结构为时次-层次-要素,支持的气象要素较少;Micaps4采用文本存储,数据结构为时次-层次-区域,支持的气象要素更多。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值