| 豆知識−WM_NOTIFYメッセージとON_NOTIFYメッセージ |
Win32では、Windows3.xでサポートされているコントロールに加えて数多くの複雑なコントロールが追加されています。これらの中には通知メッセージと共に追加データの送信を必要とするものが多いため、それぞれに専用メッセージを追加することは非常に大変です。
そこで、新たにWM_NOTIFYというメッセージを作り、これを使うことで任意の数の追加データを渡すことができるようにしてあります。
virtual BOOL CWnd::OnNotify( WPARAM wParam, LPARAM lParam, LRESULT* pResult );wParamにはメッセージを送信するコントロールのIDが格納されています。lParamには、ある構造体へのポインタが格納されています。この構造体はNMHDR構造体か、あるいはNMHDR構造体を最初のメンバに持つ構造体のいずれかです。
typedef struct tagNMHDR {
HWND hwndFrom; // メッセージを送信するコントロールのハンドル
UINT idFrom; // メッセージを送信するコントロールのID
UINT code; // 通知コード
} NMHDR;
通知コードは、例えばリストビューのヘッダのディバイダをドラッグした場合はHDN_BEGINTRACKになります。
lParamにはたいていの場合、NMHDR構造体を最初のメンバに持つ構造体へのポインタが格納されています。例えばリストビューでキーを押したときに送信されるLVN_KEYDOWNメッセージの場合は、以下のようなLV_KEYDOWN構造体が使われます。
typedef struct tagLV_KEYDOWN {
NMHDR hdr;
WORD wVKey;
UINT flags;
} LV_KEYDOWN;
最初のメンバがNMHDR構造体になっているので、lParamはNMHDRへのポインタとLV_KEYDOWNへのポインタのどちらにもキャストすることができます。