プラグインのつくりかた (初心者編)

ここではプラグインの作成について説明します。
初心者を対象としていますので少々冗長かも知れません。.NETプログラミングに慣れた人は、その2 と SDKのドキュメントを読めば作れるでしょう。

とにかく作ってみる

今回は押すとメッセージの出るボタンを作って、ボタンバーに追加してみましょう。
このサンプルプラグインのソースコード: SamplePlugin.zip

用意するもの

フリーの Microsoft Visual Studio Express Editionで十分。2008または2005をインストールしておきます。

プラグインSDKをダウンロード。

1. はじめに

今回はVisual C# 2008 Express Editionでやってみます。
ただし下位互換性のために2005相当の機能しか使いません。

クラスライブラリ として新しいプロジェクトを作ります。

plg_1_project.png
.NET Framework 2.0互換にする

2005を使う場合はこの作業は不要です。

対象のFrameworkのバージョンを変更するために、一旦プロジェクトを保存します。
その後、ソリューションエクスプローラから"Properties"をダブルクリックしてプロジェクトのプロパティを表示させ、「対象のフレームワーク」を「.NET Framework 2.0」にします。

plg_3_fw.png
plg_2_prop.png
plg_4_fw.png

さらに不要な参照を除去します。
System.Data.DataSetExtensions と System.Xml.Linq を選択してDelキーを押します。
( System.DataとSystem.Xml も今回使わないので削除してもいいのですが。)
Class1.csからも、"using System.Linq;"の一文を削除しておきます。

2. 参照するコンポーネントを設定する

まず ダウンロードしたプラグインSDKを解凍しておきます。

必須のコンポーネントを2つ追加します。

QTPluginLib.dll 「参照の追加」ダイアログの参照タブから、解凍したSDKの中のファイルを指定します。
System.Drawing.dll   「参照の追加」ダイアログの.NETタブから。

今回はメッセージダイアログを出すので、System.Windows.Forms.dllも追加しておきます。

3. PluginAttribute の適用

class1.csファイルのコードの先頭に

using QTPlugin;

と追加します。プラグインクラスを書きやすくするためです。
クラスの名前はなんでもいいです。とりあえず SampleButton としておきましょうか。

SampleButton クラスに、QTPlugin.PluginAttribute を設定します。

using System;
using System.Collections.Generic;
using System.Text;
using QTPlugin;
 
namespace SamplePlugin
{
    [PluginAttribute( PluginType.Interactive, Author = "Quizo", Name = "サンプルプラグイン", 
     Version = "0.9.0.0", Description = "サンプル プラグインです" )]
    public class SampleButton
    {
    }
}

PluginAttribute の各メンバは、QT TabBarのオプションウィンドウのプラグインタブでこのプラグインの説明として表示されます。
4. IBarButton インターフェイスの実装

さて、ボタンとして最低限の機能を提供する QTPlugin.IBarButton インターフェイスを実装します。

public class SampleButton : IBarButton

と書いて、"IBarButton" の上で右クリックメニュー → 「インターフェイスの実装」 を実行します。
挿入されたthrow文を除去し、メソッドの順番を適当に入れ替えたあとに、ボタンとして機能するコードを追加したSampleButtonクラスが次のコードです。SampleButton クラス以外は省略しています。

#region IPluginClient メンバ
 
private IPluginServer pluginServer;
 
public void Open( IPluginServer pluginServer, QTPlugin.Interop.IShellBrowser shellBrowser )
{
    this.pluginServer = pluginServer;
 
    this.pluginServer.RegisterMenu( this, 
                           MenuType.Tab,
                           "サンプルプラグインが追加したメニュー",
                           true );
}
 
public void OnMenuItemClick( MenuType menuType, string menuText, ITab tab )
{
    System.Windows.Forms.MessageBox.Show( "タブの現在のパスは" + tab.Address.Path );
}
 
public void Close( EndCode endCode )
{
    // ボタンバーからボタンが取り除かれたり、ウィンドウが閉じたときに呼ばれます。
}
 
public bool QueryShortcutKeys( out string[] actions )
{
    actions = new string[] { "1番目のショートカットキー", "2番目のショートカットキー" };
    return true;
}
 
public void OnShortcutKeyPressed( int index )
{
    System.Windows.Forms.MessageBox.Show( ( index + 1 ) + "番目のショートカットキーが押されました" );
}
 
public bool HasOption
{
    get
    {
        // このプラグインがオプションを持つなら true を返す。    
        return false;
    }
}
 
public void OnOption()
{
    // QT TabBar のオプションウィンドウで、「プラグインのオプション」ボタンが押されると呼ばれます。
}
 
#endregion
 
#region IBarButton メンバ
 
public void InitializeItem()
{
    // ボタンバーにこのボタンが追加されるたびに呼ばれます。
}
 
public System.Drawing.Image GetImage( bool fLarge )
{
    return null;
}
 
public void OnButtonClick()
{
    this.pluginServer.ExecuteCommand( Commands.SetModalState, true );
 
    System.Windows.Forms.DialogResult dr = System.Windows.Forms.MessageBox.Show(
                        "サンプル ボタンがクリックされました。\n1階層上に行きますか?",
                        "サンプル プラグイン",
                        System.Windows.Forms.MessageBoxButtons.OKCancel );
 
    if( dr == System.Windows.Forms.DialogResult.OK )
        this.pluginServer.ExecuteCommand( Commands.GoUpOneLevel, null );
 
    this.pluginServer.ExecuteCommand( Commands.SetModalState, false );
}
 
public bool ShowTextLabel
{
    get
    {
        // ボタンバーの設定が「ボタン名をいくつか表示する」のとき、
        // ボタン名を表示するなら true    
        return false;
    }
}
 
public string Text
{
    get
    {
        // このボタンのツールチップに表示される文字列です。
        return "サンプル プラグインですよ";
    }
}
 
#endregion

IPluginClient というのが現れています。IBarButtonインターフェイスは IPluginClientインターフェイスを継承しているためです。
実はこの状態でビルドしても、もうプラグインdllが完成してしまいます。簡単ですね~
5. 各メソッドの解説

それでは、メソッドを一つ一つ見ていきましょう。

private IPluginServer pluginServer;
 
public void Open( IPluginServer pluginServer, QTPlugin.Interop.IShellBrowser shellBrowser )
{
    this.pluginServer = pluginServer;
 
    this.pluginServer.RegisterMenu( this, 
                                    MenuType.Tab,
                                    "サンプルプラグインが追加したメニュー",
                                    true );
}

Open メソッドは、プラグインがインスタンス化されて一番最初に呼ばれます。
引数として渡される IPluginServer クラスのオブジェクトは QT TabBar そのもので、これを通して QT TabBar を操作することできます。
ここでは RegisterMenu メソッドを呼んで、メニューとして登録しています。
あとで使うので、ここでは御覧のように IPluginServer型 のフィールドを作って保持しておきます。

public void OnMenuItemClick( MenuType menuType, string menuText, ITab tab )
{
    System.Windows.Forms.MessageBox.Show( "タブの現在のパスは" + tab.Address.Path );
}

さきほど Open メソッドで RegisterMenu したので、ユーザーがそのメニューを実行した場合 OnMenuItemClick メソッドが呼ばれます。
引数にある ITab インターフェイスは、その名の通りメニューが実行されたタブを指しています。

public bool QueryShortcutKeys( out string[] actions )
{
    actions = new string[] { "1番目のショートカットキー", "2番目のショートカットキー" };
    return true;
}

QueryShortcutKeys メソッドは、Open メソッドに続いてQT TabBarによって呼ばれ、ショートカットキーをユーザーが登録できるようにするかを返します。
ここでは、2種類のショートカットキーを登録可能にしてみます。

public void OnShortcutKeyPressed( int index )
{
    System.Windows.Forms.MessageBox.Show( ( index + 1 ) + "番目のショートカットキーが押されました" );
}

QueryShortcutKeys メソッドで true を返したので、ユーザーがショートカットキーを登録するかもしれません。
OnShortcutKeyPressed はショートカットキーを押したときに呼ばれるメソッドです。

さて、次は IBarButton インターフェイスのメソッドです。

public void OnButtonClick()
{
    this.pluginServer.ExecuteCommand( Commands.SetModalState, true );
 
    System.Windows.Forms.DialogResult dr = System.Windows.Forms.MessageBox.Show(
                        "サンプル ボタンがクリックされました。\n1階層上に行きますか?",
                        "サンプル プラグイン",
                        System.Windows.Forms.MessageBoxButtons.OKCancel );
 
    if( dr == System.Windows.Forms.DialogResult.OK )
        this.pluginServer.ExecuteCommand( Commands.GoUpOneLevel, null );
 
    this.pluginServer.ExecuteCommand( Commands.SetModalState, false );
}

このメソッドはユーザーがこのプラグインボタンをクリックしたときに呼ばれます。
ExecuteCommand で QT TabBarに命令を出しています。

おっと! ひとつボタンとして大切なことを忘れていました。
ボタンに表示される画像を指定します。
なんでもいいので大小2つ、24×24ピクセルの画像と、16×16ピクセルの画像ファイルを用意します。

plg_ico24.bmp  plg_ico16.bmp

プロジェクトに、アセンブリ リソースを新規作成して、その名前を "Resource.resx" とします。

plg_5_resx.png

上の2つの画像ファイルを、リソースに追加します。
このとき、リソース名を クラス名_largeクラス名_small としなくてはなりません。
今の場合は SampleButton_large と SampleButton_small になりますね。

plg_6_img.png

これで QT TabBar がこのプラグインの画像を表示しようとしたとき、適切な画像オブジェクトが返るようになりました。
この名前でアクセスされるのは、インスタンス化される前に QT TabBar のオプション画面等で画像を表示する必要があるときです。

追加できたら、GetImage メソッドもこのように書き換えましょう。

public System.Drawing.Image GetImage( bool fLarge )
{
    return fLarge ? Resource.SampleButton_large : Resource.SampleButton_small;
}

GetImage メソッドで返した画像は、ボタンバーに追加されるボタンのアイコン画像になります。
この場合はリソースの画像でいいので、上で追加した2つを返すことにします。

6. ビルドしてみよう

まずソリューションを保存してから、デバッグでビルドしても仕方がないので、リリースビルドします。正常に完了しましたね?

それでは、プラグインを試してみましょう。

プラグインの追加のしかたはここらへんを参考にして、できあがったばかりの SamplePlugin.dll を QT TabBar のオプション画面から追加してみると……

plg_7_plgopt.png

いけましたね。
こんどはボタンバーにボタンとして追加してみましょう。

plg_8_plgbtnbaropt.png

ボタンを追加して、クリックしてみた画像はこちら

this.pluginServer.RegisterMenu メソッドで追加したメニューは、こんな感じです

plg_10_menu.png

ショートカットキー 設定画面にも、ちゃんとでています。

plg_11_keys.png
7. まとめ

以上でプラグインの作り方でした。
簡単に作れてしまうということが分かっていただけたでしょうか。

必須項目をまとめてみると、

  • QTPluginLib.dll と System.Drawing.dll を参照に追加する
  • プラグインのクラスには PluginAttribute を適用する
  • プラグインのクラスは、少なくとも IPluginClient インターフェイスを実装する

くらいです。

画像を出すにはResource.クラス名_large と Resource.クラス名_small というリソースを追加するんでしたね。
対応画像はbmp, jpg, gif, png などです。

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License