【问题标题】:TVN_SELCHANGING not received未收到 TVN_SELCHANGING
【发布时间】:2011-08-02 13:57:21
【问题描述】:

我有一个 WTL81 应用程序。 CMainFrame 有一个子 CPaneContainer,它有一个子窗口 CTreeViewCtrl。问题是 CTreeViewCtrl 没有收到 TVN_SELCHANGING 消息。

我“窥探”了 CTreeViewCtrl 和他的父级 (CPaneContainer),但没有收到任何通知代码。

CMainFrame 是从 public CFrameWindowImpl<CMainFrame> 实现的

CPaneContainer是这样实现的

class PaneContainerReflectNotif : public CPaneContainer 
{
    BEGIN_MSG_MAP(PaneContainerReflectNotif)
        CHAIN_MSG_MAP(CPaneContainer)
        REFLECT_NOTIFICATIONS()
    END_MSG_MAP()
};

树是这样实现的

class MyTreeView : 
    public CWindowImpl<CatalogTreeView, CTreeViewCtrl>,
    public CCustomDraw<CatalogTreeView>,
    public CTheme

   ...

BEGIN_MSG_MAP_EX(MyTreeView )
    MSG_WM_CREATE(OnCreate)
    MSG_WM_DESTROY(OnDestroy)
    REFLECTED_NOTIFY_CODE_HANDLER_EX(NM_DBLCLK, OnDblClick)
    REFLECTED_NOTIFY_CODE_HANDLER_EX(TVN_ITEMEXPANDING, OnItemExpanding)
    REFLECTED_NOTIFY_CODE_HANDLER_EX(TVN_SELCHANGING, OnSelChanged)

OnDblClick - 工作正常
OnItemExpanding - 工作正常
OnSelChanged - 不起作用

关于可能是什么问题的任何想法?

【问题讨论】:

  • 您根本没有看到 TVN_SELCHANGING?那么什么都没有被选中?
  • 项目选择正常,只是没有收到TVN_SELCHANGING通知。
  • 使用 Spy++ 工具查看发生了什么。
  • 我已经监视了 Tree 和 parent。它接收通知(NM_CUSTOMDRAW、NM_KILLFOCUS、TVN_ITEMCHANGEING 等)但不接收 TVN_SELCHANGING ...
  • 尝试将 REFLECT_NOTIFICATIONS() 添加到您的主窗口消息映射中。

标签: c++ winapi atl wtl


【解决方案1】:

解决了。我的问题是树视图是多选择的,那种树不发送 TVN_SELCHANGING 通知

【讨论】:

    【解决方案2】:

    您没有提到为什么需要 TVN_SELCHANGING。当树节点发生变化并选择另一个树节点时触发该事件。

    作为替代方案,您可以尝试 TVN_SELCHANGED 或 HitTest( )。我正在提供一个 MFC 链接.. http://msdn.microsoft.com/en-us/library/x0w7ft34.aspx

    【讨论】:

    • TVN_SELCHANGING 在选择即将从一项更改为另一项时被触发。这就是我需要的。 TVN_SELCHANGED 也没有被解雇,HitTest 我不认为它有帮助
    猜你喜欢
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    相关资源
    最近更新 更多