MFC:CDockablePane 是否收到 CTreeCtrl 的 ON_NOTIFY_REFLECT 消息?

问题描述

MFC 向导创建了一个带有 CWorkSpaceBar 的项目,在我的例子中它实际上基于 CBCGPDockingControlBar,MFC 等效项是 CDockablePane。向导还创建了一个基于 CBCGPTreeCtrl (CTreeCtrl) 的 m_wndTree。它在它的 OnCreate() 中创建它是这样的:

CRect rectDummy;
rectDummy.SetRectEmpty();

// Create tree control:
const DWORD dwViewStyle =   WS_CHILD | WS_VISIBLE | TVS_HASLInes | TVS_LInesATROOT | TVS_HASBUTTONS | TVS_SHOWSELALWAYS;


if (!m_wndTree.Create(dwViewStyle,rectDummy,this,1))
{
    TRACE0("Failed to create workspace view\n");
    return -1;      // fail to create
}

现在我想处理一些 TreeView 通知,因此我将它们添加CWorkSpaceBar 消息映射中:

ON_NOTIFY_REFLECT(TVN_ITEMEXPANDING,&CWorkSpaceBar::OnTvnItemExpanding)
ON_NOTIFY_REFLECT(TVN_GETdisPINFO,&CWorkSpaceBar::OnTvnGetdispInfo)

但是,我没有收到通知消息?我还需要做些什么才能让它发挥作用?

解决方法

您似乎混淆了 ON_NOTIFY_REFLECTON_NOTIFY 处理程序;或者更确切地说,应该定义这些处理程序的窗口。

根据您的描述,您的 CWorkSpaceBar 类/对象是树视图 (CTreeCtrl) 对象的;因此,当一个项目在该树视图中展开时,该父窗格会收到一条 WM_NOTIFY 消息,并且相关的 ON_NOTIFY 处理程序(如果在消息映射中定义)是叫。 ON_NOTIFY_REFLECT 处理程序允许实际的树视图本身拦截/接收通知。

在我的项目中,我有类似的情况,从 CDockablePane 派生的类(例如我的 UserPane)具有如下所示的消息映射条目,它们按预期工作:

    ON_NOTIFY(TVN_ITEMEXPANDING,IDR_USRTV,&UserPane::OnItemExpand)

注意:IDR_USRTV 是我给树视图的 ID 值,在它的 Create 函数中,如下所示;在您的示例代码中,您使用了 1 的值(这可能是可取的,也可能是不可取的)。

int UserPane::OnCreate(CREATESTRUCT *pCreateStruct)
{
    CRect rc;   rc.SetRectEmpty();
    const DWORD trvstyle = WS_CHILD | WS_VISIBLE |
        TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS | TVS_SHOWSELALWAYS | TVS_EDITLABELS;
    if (CDockablePane::OnCreate(pCreateStruct) == -1) return -1;
    if (!m_wndTView.Create(trvstyle,rc,this,IDR_USRTV)) return -1;
    //...

OnItemExpand 成员函数的基本概要如下:

void UserPane::OnItemExpand(NMHDR *pNotifyStruct,LRESULT *result)
{
    *result = 0;
    NMTREEVIEW *pTV = reinterpret_cast<NMTREEVIEW *>(pNotifyStruct);
    HTREEITEM hItem = pTV->itemNew.hItem;
    uintptr_t itemData = m_wndTView.GetItemData(hItem);
    if (pTV->action == TVE_EXPAND) {
        //...
    }
    else if (pTV->action == TVE_COLLAPSE) {
        //...
    }
    return;
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...