.NETプログラミング研究 第27号 †ピンポイントリンク †Docking Windowを使う †
Visual Studio .NETのメインウィンドウの上下左右には、ツールボックス、ソリューションエクスプローラ、プロパティウィンドウなどがくっついており、これらはドラッグすることにより、分離させてウィンドウにしたり、別の位置にドッキングさせたり、サイズを変えたりすることが出来るようになっています。このようなウィンドウをDocking Windowと呼びます。ここでは、.NETでDocking Windowを可能にするライブラリを紹介します。(ここでは無料で使用できるものしか紹介しません。) 何をおいてもまず初めに紹介しなければならないのが、Phil Wrightさんの「Magic Library」にある「Magic Docking」です。 このMagic Dockingは、オープンソースの.NET用IDEとして有名な「SharpDevelop」でも使用されていることからも、その信頼度の高さがうかがい知れます。 Magic Dockingはとにかく高機能です。Visual Studio .NETのDocking Windowと見た目が似ているだけでなく、「自動的に隠す」機能(右上のピンのマークをクリックすることにより、Windowが自動的に隠れ、マウスを持っていくことにより、再び表示できる機能)や、タブとしてドッキングさせる機能、Docking Windowの状態をXMLファイルやバイト型配列に保存し、復元する機能など、申し分ありません。 使い方も簡単です。「MagicLibrary.DLL」を「参照設定」に追加し、次のようなコードをフォームのLoadイベントハンドラ(またはコンストラクタ)に書くだけで、Docking Windowができてしまいます。(たった4行!!)
このようにMagic Dockingの使用は決して難しいものではありませんが、Visual Studio .NETのフォームデザイナを使って設定できるようになればもっと便利になるかもしれません。それを可能にするのが、Jerry Maguireさんの「DockingManagerExtender」です。これを使えば、コードを自分で一行も書く必要がなくなります。 使い方は、「MagicLibrary.DLL」が「参照設定」に追加された状態で、「ツールボックス」の「コンポーネント」に「DockingManagerExtender.DLL」を追加し、これをフォームに貼り付けるだけです。フォームに貼り付けたDockingManagerExtenderのContainerControlプロパティを適当に設定し(通常は貼り付けたフォームとなるでしょう)、Docking Windowとするコントロールの「DockingManagerExtenderのADockingEnable」プロパティをTrueとすれば、Docking Windowが出来上がります。 このようにMagic Dockingは、まさに最強といえますが、残念なことに、Magic Libraryは有料化され、「DotNetMagic」となりました。(有料化は私個人としては残念ですが、サポートが受けられるようになったということでは、むしろうれしく思う人も多いかもしれません。)バージョン1.7.4までのMagic Libraryは今まで通り無料で使用できますが、少なくともバージョン1.7.4は私の知る限り、どこにも公開されていないようです。(上記「The Code Project - Magic Docking - VS.NET Style」からバージョン1.7.0がダウンロードできるようです。MagicLibrary.DLLはSharpDevelopなどに含まれているので、今のとことは簡単に入手できます。) Magic Dockingと同様の見た目と機能を持つライブラリに、Weifen Luoさんの、「DockManager Control」があります。DockManager ControlはMDIフォームに対するドッキングを可能とすることを目的としているそうです。(最新バージョンは1.2.3。)
DockManager Controlでは、Docking WindowとなるContentクラスがSystem.Windows.Forms.Formクラスを継承しているため、Docking Windowのデザインをフォームデザイナで行えます。 DockManager Controlをちょっと使ってみましょう。まず、「ツールボックス」の「コンポーネント」に「WeifenLuo.WinFormsUI.dll」を追加します。「DockManager」をフォームに貼り付け、DockプロパティをFillにしておきます(しなくても結構です)。このDockManagerの部分にDocking Windowがドッキングされます。 次にDocking Windowを作成します。「新しい項目の追加ダイアログ」を表示し、「継承されたフォーム」を選択後、「開く」をクリックします。「継承ピッカー」の「参照」をクリックし、「WeifenLuo.WinFormsUI.dll」を選択後表示される「Content」を選択し、OKをクリックします。これで作成されるクラスがDocking Windowとなりますので、フォームデザイナで適当にデザインしましょう。 作成したDocking Windowを表示させるには、Showメソッドを使用します。次の例では、DockManagerオブジェクトdockManager1に、Docking WindowのForm2を左端にドッキングされた状態で表示させています。
DockManager ControlはMagic Dockingと互角の機能をもっており、便利なコントロールですが、まだまだバグが多いようです。 Docking Windowを可能にするライブラリはまだまだあります。以下にずらずら並べて見ます。(ほとんどが私は実際に試していません。) これは、Magic Dockingの作者Phil Wrightさんがそれ以前に作成したコントロールであるようです。 フォームデザイナでフォームに貼り付け、デザインできます。機能は少なく、バグも多いようです。 「This is a docking control like in IDE.」とのことです。 非商用での使用のみ無料で使用できるようです。 有料のものを含め、「Windows Forms」でもいくつか紹介されています。 なお、ここで紹介されていないものをご存知の方は、ぜひご連絡ください。よろしくお願いいたします。 .NET質問箱 †VarPtr, StrPtr, ObjPtr関数の代わりになるものは? †
質問: Visual Basic 6.0のVarPtr, StrPtr, ObjPtr関数がVB.NETではなくなりましたが、何か換わりになるものはないでしょうか? 答え: VB6のVarPtr, StrPtr, ObjPtr関数は変数の下位のメモリアドレスを取得するためのドキュメント化されていない関数です。「Visual Basic .NET へのアップグレードを円滑に行うための Visual Basic 6.0 アプリケーションの準備」や「VB 6.0 ユーザーのための VB .NET 移行ガイド - レガシー機能」によると、これらの関数はVB.NETではサポートされていないとのことです。
.NETではこれらの機能が必要になる機会はそうはないでしょうが、.NETでもオブジェクトのアドレスを取得することは可能です。しかしこのとき問題になるのは、アドレスを取得し、それを使用する間、共通言語ライブラリ(CLR)によってこのアドレスが変更されないことを確実にしなければならないということです。共通言語ライブラリはガベージコレクタによって、効率化のためにオブジェクトをメモリ内で移動しているのです。 そのため、オブジェクトのアドレスはGCHandle.AddrOfPinnedObjectメソッドで取得し、このときに必要なハンドルはGCHandle.Allocメソッドで取得します。使い終わった後はGCHandle.Freeメソッドによりハンドルを解放します。 次のサンプルは、オブジェクト"obj"のアドレスを取得するものです。
参考: 掲示板過去ログ: https://dobon.net/vb/bbs/log3-1/50.html DataGridコントロールのセル内でのキーイベントを補足するには? †
質問: DataGridコントロール(System.Windows.Forms)のセル内でキーをたたいた時のKeyDownイベントを捕捉したいのですが、DataGridのKeyDownイベントでは認識してくれません。どのようにすればよいのでしょうか? 答え: DataGridコントロールのKeyDownイベントではなく、セルのTextBoxのKeyDownイベントを捕捉するようにします。セルのTextBoxオブジェクトは列スタイルDataGridTextBoxColumnのTextBoxプロパティから取得できます。 次の例では、DataGridコントロールDataGrid1にテーブルスタイル"DataTable1"が設定されているものとし、その1列目のセルでのKeyDownイベントを捕捉しています。
掲示板過去ログ: https://dobon.net/vb/bbs/log3-1/31.html DataGridコントロールのAllowSortingプロパティをFalseにしても並べ替えができてしまう †
質問: DataGridコントロール(System.Windows.Forms)のAllowSortingプロパティをFalseにしても、列カラムをクリックすると並び替えされてしまいます。なぜでしょうか? 答え: DataGridコントロールにテーブルスタイルが設定されていないか確かめてください。DataGridコントロールにテーブルスタイルが設定されている時、並び替えの許可、不許可はDataGridコントロールのAllowSortingプロパティで設定するのではなく、使用しているDataGridTableStyleのAllowSortingプロパティで設定する必要があります。 よってDataGridコントロールにテーブルスタイルが設定されているときは、設定されているDataGridTableStyleのAllowSortingプロパティをFlaseにします。ほとんどの場合、これで解決できるでしょう。 次の例では、DataGridコントロールDataGrid1にテーブルスタイル"DataTable1"が設定されている時に、列ヘッダのクリックで並び替えをできないようにしています。
掲示板過去ログ: https://dobon.net/vb/bbs/log3-1/157.html コメント †
|