potisanのプログラミングメモ

プログラミング素人です。昔の自分を育ててくれたネット情報に少しでも貢献できるよう、情報を貯めていこうと思っています。Windows環境のC++やC#がメインです。

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:この記事は別のブログで投稿した記事を移動したものです。