如何检测我的WTL :: CListViewCtrl选择的变化,而不是在父?(How to dete

2019-07-21 15:09发布

我有我自己的WTL导出列表控件。

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

它工作正常,除了一两件事:我想,当选择更改为赶上通知。 不在父窗口(如下: ?如何检测一个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)

Answer 1:

该通知消息反正发送给家长,你无法改变这一点。 你平常做的是从父到子消息反射,让[改进]孩子可以照顾它的祖先生成的通知。

父窗口将有消息地图上的反映处理程序:

#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在这里你可以处理控件的通知,但家长负责把他们(有或没有自己的处理)。

另见在CodeProject这个词WTL宏处理反射消息的 。



Answer 2:

该任择议定书的问题已经解决。 但是,对于那些你该通知消息还没有得到发表,阅读...

您可能需要继承的窗口!

让我们假设你所有的信息正确映射你已经配置。 通过与调试器步进你看到父对话框试图将邮件传递到控制。

换句话说,你看到它调用SendMessage来发送消息。 如果WM_NOTIFY得到由母体反射,然后OCM_NOTIFY将被发送到所导出的控制。

然而,什么也没有发生在你的派生控件的消息处理程序。

如果你的父窗口的代码不仅会像MyDerivedControl.Attach(hwndControl)那么你就不会在你的派生控件类收到任何消息。 在幕后Attach将复制在窗口句柄( HWND ),这就是它。 为了能够从你的派生控制系统需要设置一些其他的事情处理的消息。

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



文章来源: How to detect a selection change in my WTL::CListViewCtrl, and not in the parent?