如何在my WTL::CListViewCtrl中检测选择更改,而不是在父对象中检测选择更改?
我有自己的WTL派生列表控件如何在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
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()