1

我有自己的 WTL 派生列表控件。

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

它工作正常,除了一件事:我想在选择更改时捕获通知。不在父窗口中(像这样:How to detect a CListCtrl selection change?),而是在CPopupList本身,然后做一些事情。

实际上,我希望在当前所选项目旁边出现一个小提示窗口,作为当前项目的附加信息。就像 VS 在自动完成期间所做的那样,提供有关功能/属性的更多信息。

有没有人有任何提示如何做到这一点?非常感谢。


更新:

试过:

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

但是 OnListItemChanged() 没有被调用。在父级

REFLECT_NOTIFICATIONS()

被添加。


更新 2 - 解决方案

我发现了问题:

父母的 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 回答