コモンコントロールとWM_NOTIFYとWM_COMMAND
通知メッセージのくせにWM_COMMANDで届く
WM_COMMANDと言えばメニューバーが操作されたときに届くメッセージ。
だけどそれだけじゃない。
なんと、コンボボックスが操作されたとき、通知メッセージがWM_COMMANDで届く。
(コンボボックスはコモンコントロールの一種。他のコモンコントロールの通知メッセージは、普通はWM_NOTIFYで届く。)
MSDNで適当に調べてみたので、そのまとめ。
コモンコントロールの一覧と、通知メッセージ
普通はWM_NOTIFYで通知メッセージが届きます。
また、WM_COMMAND/WM_NOTIFY両方とも使うやつもあるみたいです。
C=WM_COMMAND, N=WM_NOTIFY
コモンコントロール | 通知メッセージ |
ComboBox | C |
AnimationCtrl | C |
RichEditCtrl | C/N |
ListView | N |
TreeView | N |
HeaderCtrl | N |
ToolBar | N |
TabCtrl | N |
ToolTip | N |
TrackBar | N |
UpDownCtrl | N |
ReBarCtrl | N |
DragListBox | 不明(*1) |
Progress | ないかもしれない(*2) |
StatusBar | ないかもしれない |
HotKeyCtrl | 不明 |
僕自身、GUIの経験があまりにも浅いので、使ったことのないものがほとんどです。
ひょっとしたら大きな勘違いをしてるかもしれないですが、指摘していただけるとうれしいです。
あとがき
MSDNって文書の形式に一貫性がないですね。
同じコモンコントロールにしても、タイトルが"List-View"とか"Combo Box"とか、
"TreeView"なんてなってて検索しにくい。
中身(構成)も結構ばらばら。ページが分けてあったり、分けてなかったり。
サンプルはあったりなかったり。(あるだけでも、ありがたいんですけどね。)
追記
10/04/02
WM_COMMANDとWM_NOTIFYの違いには歴史的な理由があるかもしれません。
歴史的な理由っていうとすごい感じですが、つまり負の遺産ですね。
こちらのページの最初の方を参照。
VC++テクニック:豆知識-WM_NOTIFYとOn_Notify
WM_COMMANDには、(負の遺産により)あまり多くの情報を渡すことができない。
だからWM_NOTIFYが作られた。(WM_NOTIFYのlParamは、情報が詰まった構造体へのポインタ)
ってな所ですかね。