2

カスタム グリッドリストの所有者に LVN_ ITEMCHANGED を投稿しようとしています。PostMessage を使用して WM_ User メッセージを送信する方法を知っています (ここに示すように)

::PostMessage( AfxGetMainWnd()->GetSafeHwnd(), WM_REFRESH, (WPARAM)pBuffer, (LPARAM)GetOutputIdx() );

この同じコードを使用して LVN_ITEMCHANGED メッセージを送信すると、

::PostMessage( AfxGetMainWnd()->GetSafeHwnd(), LVN_ITEMCHANGED, 0, 0);

に引っかからないようです。

ON_NOTIFY(LVN_ITEMCHANGED, ..., ...) 

私は所有者クラスにいます。

::PostMessage を使用して Notify イベントを送信するのは間違っていますか?
Notify メッセージと WM_ プレフィックス メッセージに違いはありますか、またはそれらの処理方法はありますか?
誰かがメッセージを適切に送信する方法のサンプルを投稿できますか?

前もって感謝します。

編集
問題の別の解決策を見つけました。以下の私の答えを見てください。

4

2 に答える 2

7

WM_NOTIFYを送信し、制御IDをwParamとして渡し、NMHDR*をlParamとして渡します。

NMHDR変数を割り当てて、適切に入力する必要がありますcode。LVN_ITEMCHANGEDとidFromコントロールIDに設定します。受信側はNMHDR*ポインタを介してメモリを直接読み取るため、SendMessage()のみを使用でき、PostMessage()は使用できません。

このようなSmth:

NMHDR nmhdr;
nmhdr.code = LVN_ITEMCHANGED;
nmhdr.idFrom = controlId;
nmhdr.hwndFrom = controlWindowHandle;
SendMessage( targetWindowHandle, WM_NOTIFY, controlId, &nmhdr );
于 2009-08-13T14:45:34.833 に答える
4

メッセージ マップで次のコードを使用するだけで、派生クラスでメッセージ ハンドラーをオーバーライドし、親コントロールにメッセージを渡すことができることがわかりました。

ON_NOTIFY_REFLECT_EX(LVN_ITEMCHANGED, OnListItemChanged)

次に、OnListItemChanged で、最初に基本クラス関数を呼び出してから FALSE を返します。これにより、メッセージは親クラスに簡単に反映されます。

于 2009-08-14T15:16:40.147 に答える