1

私は自分のWTL派生リストコントロールを持っています。

CPopupList : public CWindowImpl<CPopupList, WTL::CListViewCtrl>,

選択が変更されたときに通知をキャッチしたいという1つのことを除いて、正常に動作します。親ウィンドウではなく(このように:CListCtrlの選択の変更を検出する方法は?)、CPopupList自体で、いくつかのことを実行します。

実際、現在選択されているアイテムの横に、現在のアイテムの追加情報として小さなヒントウィンドウを表示したいと思います。VSがオートコンプリート中に行うのと同じように、関数/プロパティに関する詳細情報を提供します。

誰かがこれを行う方法のヒントはありますか?どうもありがとうございます。


アップデート:

試した:

BEGIN_MSG_MAP(CPopupList)
    REFLECTED_NOTIFY_CODE_HANDLER(LVN_ITEMCHANGED, OnListItemChanged)
    DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()

ただし、OnListItemChanged()は呼び出されません。親では

REFLECT_NOTIFICATIONS()

が追加されます。


Update2-ソリューション

私は問題を見つけました:

親のMSG_HANDLER:

BEGIN_MSG_MAP(CEditorCtrl)
    MESSAGE_RANGE_HANDLER(WM_KEYFIRST,WM_KEYLAST,DelegateMessages)
    ...
    MESSAGE_
    ...
    NOTIFY_CODE_HANDLER(LVN_ITEMCHANGED,OnListItemChanged)
    CHAIN_MSG_MAP(parentType)
    ALT_MSG_MAP(11)
    COMMAND_HANDLER(IDC_PRINT_MONOCHROME,BN_CLICKED,OnPrintMonochromeButton)
    REFLECT_NOTIFICATIONS()
END_MSG_MAP()

REFLECT_NOTIFICATIONS()をALT_MSG_MAP(11)の上に移動すると、最後にOnListItemChangedがコントロールで呼び出されます。

正しい:

    REFLECT_NOTIFICATIONS()
    ALT_MSG_MAP(11)
    COMMAND_HANDLER(IDC_PRINT_MONOCHROME,BN_CLICKED,OnPrintMonochromeButton)
4

2 に答える 2

2

とにかく通知メッセージは親に送信されます。これを変更することはできません。あなたが通常行うことは、親から子へのメッセージの反映です。これにより、[改善された]子は、その祖先によって生成された通知を処理できます。

親ウィンドウには、メッセージマップにリフレクティングハンドラーがあります。

#include <atlcrack.h>

BEGIN_MSG_MAP_EX(CMyDialog)
    // ...
    REFLECT_NOTIFICATIONS()
END_MSG_MAP()

また、コントロールには、コントロールの親によって反映されるWM_NOTIFY通知のハンドラーがあります。

BEGIN_MSG_MAP_EX(CPopupList)
    // ...
    //MSG_OCM_CTLCOLORSTATIC(OnReflectedCtlColorStatic) // Reflected WM_CTLCOLORSTATIC
    MSG_OCM_NOTIFY(OnReflectedNotify) // Reflected WM_NOTIFY
    DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()

OnReflectedNotifyコントロールの通知を処理できる場所ですが、親はそれらを転送する責任があります(独自の処理の有無にかかわらず)。

反映されたメッセージの処理については、WTLマクロのCodeProjectに関するこの単語も参照してください。

于 2013-03-14T17:04:50.170 に答える
0

OPの問題は解決されました。しかし、通知メッセージがまだ配信されない方は、以下をお読みください...

ウィンドウをサブクラス化する必要があるかもしれません!

すべてのメッセージマップを正しく構成したと仮定します。また、デバッガーを操作すると、親ダイアログがメッセージをコントロールに配信しようとしていることがわかります。

SendMessageつまり、メッセージを配信するために呼び出していることがわかります。WM_NOTIFY親に反映されるとOCM_NOTIFY、派生コントロールに送信されます。

ただし、派生コントロールのメッセージハンドラーでは何も起こりません。

親ウィンドウコードが次のようなことだけを行う場合MyDerivedControl.Attach(hwndControl)、派生コントロールクラスでメッセージを受信することはありません。舞台裏ではAttach、ウィンドウハンドル(HWND)をコピーします。これで終わりです。派生コントロールからのメッセージを処理できるようにするには、システムは他のいくつかの設定を行う必要があります。

実際には、SubclassWindowの代わりに呼び出すことを意味しAttachます。

于 2019-03-15T12:38:48.360 に答える