如何在我的WTL :: CListViewCtrl中检测选择更改,而不是在父级中?

时间:2013-03-14 16:28:49

标签: listview visual-c++ wtl selectionchanged

我有自己的WTL派生listcontrol。

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)

2 个答案:

答案 0 :(得分: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 macros for handling reflected messages中的CodeProject上的相关内容。

答案 1 :(得分:0)

OP的问题已解决。但是对于那些仍然无法发送通知消息的人,请继续阅读...

您可能需要subclass窗口!

让我们假设您已正确配置所有消息映射。通过调试器的执行,您会看到父对话框正在尝试将消息传递给控件。

换句话说,您看到它调用SendMessage来传递消息。如果WM_NOTIFY被父级反映,则OCM_NOTIFY将被发送到派生控件。

但是,派生控件的消息处理程序中什么也没发生。

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

实际上,这意味着调用SubclassWindow而不是Attach