2008年12月16日火曜日

はっちゅう君プラスのAddInFormの使い方

昨日のだと、昨日も今日の午前も怒られなかったのに、午後になって急にWeifenLuo.WinFormsUI.Dockingが怒り出した。MDIにドッキングする前にドッキング状態をいじったらいけないとかそんな感じらしい。

改めてAddInFormに関する一番基本事項(しかしろくにドキュメント化されていない)の覚書き。これらを実行すると
  • フロート状態のウィンドウのサイズがちゃんと復元される。
  • フロート状態のウィンドウははっちゅう君プラスにつられて最小化されたりせず独立している
  • フロート状態のウィンドウは何も設定していないとはっちゅう君が最小化していても上下左右へのドッキングアイコンが現れてうざいのだがそれが出なくなる
というご利益がある。

結局

public class MimohutaForm : AddInForm
{
#region メソッド
private void decideAllowEndUserDocking()
{
if (ClickSec.Trading.Core.Main.ApplicationHost.Instance == null) {
this.AllowEndUserDocking = false;
} else {
if (ClickSec.Trading.Core.Main.ApplicationHost.Instance.Workbench.WindowState
== System.Windows.Forms.FormWindowState.Minimized) {
this.AllowEndUserDocking = false;
} else {
this.AllowEndUserDocking = true;
}
}
}
private void setIndependentWindow()
{
decideAllowEndUserDocking();
this.TopMost = true;
this.TopLevel = true;
this.ShowInTaskbar = true;
}
private void setDependentWindow()
{
decideAllowEndUserDocking();
this.TopMost = false;
this.TopLevel = false;
this.ShowInTaskbar = false;
}
#endregion

#region カスタムしたメソッド
protected override void OnDockStateChanged(EventArgs e)
{
if (this.DockState == DockState.Float) {
setIndependentWindow();
} else {
setDependentWindow();
}
base.OnDockStateChanged(e);
}
protected override void OnSizeChanged(EventArgs e)
{
if (this.DockState == DockState.Float) {
this.ClientSize = this.ClientSize;
}
base.OnSizeChanged(e);
}
protected override void OnLoad(EventArgs e)
{
if (ClickSec.Trading.Core.Main.ApplicationHost.Instance == null) {
setIndependentWindow();
} else {
if (this.DockState == DockState.Float) {
setIndependentWindow();
} else {
setDependentWindow();
}
ClickSec.Trading.Core.Main.ApplicationHost.Instance.Workbench.Resize += delegate {
decideAllowEndUserDocking();
};
}
base.OnLoad(e);
}
#endregion
}

こんな感じにAddInFormを拡張して、例えばMimohutaMainクラスのインナークラスとして定義、コンストラクタでmimohutaFormとして生成し、パブリックなFormプロパティから参照できるようにしてビルダークラスはサンプルどおりに

class MimohutaBuilder : IAddInFormBuilder
{
public IAddInForm AddInForm
{
get
{
return (new MimohutaMain()).Form;
}
}
public string Value { get; set; }
public void Dispose() { }
}

としてやるべきらしい。ビルダークラスにおいてFormを返す前に勝手にShow()などをしてはいけないみたい。

なお、上の例でClickSec.Trading.Core.Main.ApplicationHost.Instanceの実体があるかどうかをチェックしているのかは私のアドインはデバッグの利便性のためにスタンドアロンでも動けるようにしているから。ただのアドインでよければ削れる。

さて、その上で.Addinファイルの中で<AddIn>要素の中に

<Path name="/AddIn/Forms">
<Form id="Tomorrowplusplus.Mimohuta.MimohutaMain+MimohutaForm"
builder="Tomorrowplusplus.Mimohuta.MimohutaBuilder" />
</Path>

とフォームの型のフルネームとビルダークラスを紐付けする。これではっちゅう君プラス起動時にフォームが復元される。

それから、AddInFormの拡張でGetPersistStringを拡張したければ

protected override string GetPersistString()
{
return base.GetPersistString() + "," + ほにゃらら.ToString();
}

みたいにすると、ビルダークラスのAddInFormのget時にはValueプロパティに","以降の文字列が入っているのでにゃんにゃんすればフォーム毎の設定の保存・復元ができる。

以上。これでフロート状態では独立して振舞うなど、フロート注文ウィンドウと同じような動作になるし、フロート状態でサイズが復元されない問題も対処できる。

あと、本日前場の動画をまた作ってしまった。貼り付ける必要はないだろう。サイドバーのリストから見てね。ニコニコ動画ならmp4で綺麗。youtubeなら&fmt=18オプションを付けると綺麗になる。

0 件のコメント: