2009年2月1日日曜日

はっちゅう君プラスのアドインライブラリのAddInFormの使い方(改)

何度か取り上げたAddInFormの拡張の仕方。はっちゅう君プラス本体を最小化した時にフロートウィンドウに対するドックインジケータが表示されるというのは勘違いだった。よって、(1)フロート時に最前面に表示する(2)フロートウィンドウが起動時に復元された時サイズも正しく復元する、の二点のみを解決すれば良い。コードはこんな感じ。

public class ほにゃらら : AddInForm
{
#region メソッド
private void setIndependentWindowOrDependentWindow()
{
if (this.DockState == DockState.Float) {
this.TopMost = true;
this.TopLevel = true;
} else {
this.TopMost = false;
this.TopLevel = false;
}
}
#endregion

#region カスタムしたメソッド
protected override string GetPersistString()
{
//インスタンス毎に保持する設定を永続化文字列に", "に続けて繋げて返す。
return base.GetPersistString() + ", " + ほにゃらら;
}
protected override void OnDockStateChanged(EventArgs e)
{
setIndependentWindowOrDependentWindow();
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)
{
setIndependentWindowOrDependentWindow();
base.OnLoad(e);
}
#endregion
}

ただ、起動時に復元されたフローティングフォームの最前面表示の設定(TopMost=true)が有効にならない問題は未だ解決せず。まあ、ビルトインの注文フォーム(フロート)でも同じ問題があるし、ここまでやれば御の字だろう。


追記:上記問題は、setIndependentWindowOrDependentWindowメソッドを

private void setIndependentWindowOrDependentWindow()
{
if (this.DockState == DockState.Float) {
this.TopMost = true;
this.TopLevel = true;
} else {
this.TopMost = true;//ポイント!
this.TopLevel = false;
}
}

と変更すると解決するようだ。どうやら、はっちゅう君プラスの起動時にフォームが復元される時、DockStateがDockState.Floatにセットされていないのが問題のようだが、ドッキングフォームの場合TopMostプロパティに意味はないので、フロート状態であるか否かに関わらずTopMostプロパティをtrueにしてやれば良いという事らしい。

0 件のコメント: