如何在my WTL::CListViewCtrl中检测选择更改,而不是在父对象中检测选择更改?

如何在my WTL::CListViewCtrl中检测选择更改,而不是在父对象中检测选择更改?,listview,visual-c++,wtl,selectionchanged,Listview,Visual C++,Wtl,Selectionchanged,我有自己的WTL派生列表控件 CPopupList : public CWindowImpl<CPopupList, WTL::CListViewCtrl>, 但不会调用OnListItemChanged()。 在父对象中 REFLECT_NOTIFICATIONS() 增加了 更新2-解决方案 我发现了问题: 父级的MSG_处理程序: BEGIN_MSG_MAP(CEditorCtrl) MESSAGE_RANGE_HANDLER(WM_KEYFIRST,WM_KEY

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

CPopupList : public CWindowImpl<CPopupList, WTL::CListViewCtrl>,
但不会调用OnListItemChanged()。 在父对象中

REFLECT_NOTIFICATIONS()
增加了


更新2-解决方案

我发现了问题:

父级的MSG_处理程序:

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_映射(11)上方,最后在控件中调用OnListItemChanged

正确:

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

通知消息已发送到父级,您无法更改。您通常要做的是从父级到子级的消息反射,以便[改进的]子级可以处理其祖先生成的通知

父窗口将在消息映射上有一个反射处理程序:

#include <atlcrack.h>

BEGIN_MSG_MAP_EX(CMyDialog)
    // ...
    REFLECT_NOTIFICATIONS()
END_MSG_MAP()
OnReflectedNotify
是您可以处理控件通知的地方,但父级负责转发它们(有或没有自己的处理)


另请参阅中关于此代码项目的文字。

OP的问题已解决。但对于那些尚未发送通知消息的人,请继续阅读

你可能得靠窗户

假设您已正确配置了所有消息映射。通过使用调试器,您可以看到父对话框正试图将消息传递给控件

换句话说,您可以看到它调用
SendMessage
来传递消息。如果父控件反映了
WM\u NOTIFY
,则将
OCM\u NOTIFY
发送到派生控件

然而,在派生控件的消息处理程序中没有发生任何事情

如果父窗口代码只执行类似于
MyDerivedControl.Attach(hwndControl)
的操作,那么您将不会收到派生控件类上的任何消息。幕后
Attach
将复制到窗口句柄(
HWND
)上,仅此而已。为了能够处理来自派生控件的消息,系统需要设置其他一些东西


实际上,这意味着调用
子类窗口
,而不是
附加

谢谢。我的注释BEGIN_MSG_MAP_EX和MSG_OCM_NOTIFY在编译过程中给出语法错误。在不出厂的情况下开始地图。我尝试的内容:反射的通知代码处理程序(LVN\u ITEMCHANGED,OnListItemChanged)我将更新问题,但不起作用。您需要\include(WTL的文件)BEGIN\u MSG\u MAP\u EX是对ATL的BEGIN\u MSG\u MAP的WTL增强,将通知代码处理程序添加到父级,并在父级中调用。奇怪。但没有反映在孩子身上。终于用这个更新了问题!!我有解决办法。由于你的答复对我帮助很大,我接受你的答复。将用答案更新问题
#include <atlcrack.h>

BEGIN_MSG_MAP_EX(CMyDialog)
    // ...
    REFLECT_NOTIFICATIONS()
END_MSG_MAP()
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()