コントロールの場合、WM_COMMANDが発生した時、リソースIDとは別にどういう操作が行われたかを示す通知コードを返す。
ボタンが押された時には、押されたボタンのリソースIDとともに、BN_CLICKEDという通知コードが返ってくる。
BN_CLICKED notification code - Windows applications | Microsoft Docs
通知コードは、HIWORD(wParam)で取得できるが、メニューは常に0、アクセラレータは常に1になり、コントロールの場合はあらかじめ定められた通知コードになる。
Win32プロジェクトで、
空のプロジェクト。
BN_CLICKED.cppを追加。
中身は以前WM_CLOSEのトピックで使ったWM_CLOSE.cppをベースにしている。
Menuリソースを追加。
これも中身(BN_CLICKED.rcやresource.h)をWM_CLOSEのトピックで使ったものに差し替える。
ソースコードの違いとしては、
メニューアイテムの場合、HIWORD(wParam)は0なので、HIWORD(wParam)の値をOutputDebugStringでデバッグ出力。
ボタンの場合、HIWORD(wParam)はBN_CLICKEDだが、BN_CLICKEDは0なので、前に"BN_CLICKED: "と付けて、HIWORD(wParam)の値をOutputDebugStringでデバッグ出力。
[デバッグ開始]で、
最初はこうだが、
メニューアイテムを選択すると、
これが出て、OKを押すと終了する。
この時、デバッグ出力は、
こうなっている。
HIWORD(wParam)は0。
もう一度、デバッグ開始。
今度はボタンを押すと、
これが出るので、OKで終了する。
この時のデバッグ出力は、
こうなる。
"BN_CLICKED: "の後に、HIWORD(wParam)が出ているが0である。
Sample/winapi/BN_CLICKED/BN_CLICKED/src/BN_CLICKED at master · bg1bgst333/Sample · GitHub