...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

DFL: ToolBarのサンプルコード

ツールバーのサンプルコードです。

長くなるのでソースコードはこちらにリンクを張っておきます。

下図の左から、普通のボタン、トグルボタン、セパレータ(区切り)、ドロップダウンボタン、矢印分離ドロップダウンボタン、セパレータ、ラジオボタン3つ(グループ1)、セパレータ、ラジオボタン(グループ2)です。

ビジュアルスタイルを有効にすると、3Dスタイルではなくなり、フラットスタイルしか選べなくなるので、サンプルコードではコメントアウトして無効にしています。

普通のボタンを押すとボーダースタイルが変化します(3種類)。 ボーダースタイルの設定機能は、WinFormsを参考にして今回実装しました。

トグルボタンを押すとフラットスタイルになると同時に、リストスタイルになります。 フラットスタイルとリストスタイルの表示形式は、今回実装しました。 サンプルコードでは同時に変更していますが、両スタイルは個別に設定可能です。

ドロップダウンボタンを押すとドロップダウンリスト風のコンテキストメニューが表示されます。 このメニューでmsgBox()を呼ぶと2回WM_COMMANDが飛んできてしまい、2回msgBox()が呼ばれてしまって困りましたが、そうならないように直しました。

矢印分離ドロップダウンボタンのボタン部を押すと、普通のボタンと同様の挙動をします。 矢印部を押すと、ドロップダウンリスト風のコンテキストメニューが表示されます。 こちらもおかしな挙動に悩まされましたが、違和感ない挙動に修正しました。 WM_COMMAND、WM_LBUTTONDOWN及びWM_LBUTTONUPメッセージを捉えて自力で動かしています。

ドロップダウン系ボタンは、普通、BN_CLICKED通知を捉えて、メニュー項目が選択されたことを取得するようですが、どうも奇妙な挙動をするので、使わないことにしました。

ラジオボタンは、セパレータでグループが自動的に区切られるようです。 ラジオボタンは、同一グループ内で1つのボタンしか押下状態になりません。 新たにボタンが押下状態になるときは、以前に押下状態であったボタンは勝手に解放状態になります。 また、グループが分かれていることがテストできるように、ダミーのラジオボタンを右端に付けています。

上図は、フラットスタイルかつリストスタイルにしたものです。 visibleプロパティの動作確認のため、トグルボタンを押した状態ではラジオボタン3つを非表示にしています。

上図は、ドロップダウンメニューを表示させた様子です。 元々書かれていたコードを活用しようとしている間は、変な挙動が直らず苦戦しましたが、これを諦めて自作のウィンドウプロシージャでoverrideして全部上書きしたら割とすぐにできました。

以前のリストボックスでもそうでしたが、コモンコントロールの挙動がイマイチのときは、自分でウィンドウメッセージとウィンドウ通知を捉えて、自力で挙動を精微にコントロールしてやる方がいいようです。

WinFormsとの違い

.NET Core 3.1以降はToolStripクラスに移行されたため、ToolBarクラスが使えません。 そうしてToolBarの実装が中止されたせいか、Windows APIに存在するツールバー関係の機能がWinFormsのToolBarクラスには一部実装されていないようです。 具体的には、矢印分離ドロップダウンボタンとラジオボタンは、ボタンのスタイルとして選択できないようですし、ツールバーをリストスタイルで表示する機能もないようです。 また、非ビジュアルスタイル下でのフラットスタイルも選択できないようです。 そのため、この辺りは本家WinFormsよりも高機能になりました。

まあ、本来であればToolStripクラスを実装したいところなのですが。

DFLのダウンロード

github.com