potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

Windows BS_SPLITBUTTONとHDF_SPLITBUTTON

C#の標準コントロール(Button、ColumnHeader)で実装されていないので気付きませんでしたが、Button(標準コントロール)、Header(コモンコントロール)にスプリットボタン機能が追加されていました。

ButtonではウィンドウスタイルのBS_SPLITBUTTON、HeaderではHDM_GETITEM/SETITEMウィンドウメッセージのHD_ITEM構造体fmtフィールドのHDF_SPLITBUTTONがその有効化に関わり、対応するコードのWM_NOTIFYに応答する形で実装できるようです。ColumnHeaderは複雑になりそうですがButtonなら派生クラスでウィンドウスタイルの書き換えやメッセージループのカスタマイズが可能なので、SplitButtonコントロールなども作れます。

ExplorerのカラムフィルタではHDF_SPLITBUTTONが使われており、そこをクリックして出てくるポップアップリストはListViewのポップアップで対応しているようです。

参考

2021/3/10:この記事は別のブログで投稿した記事を移動したものです。