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

Winapi MFC:CDockablePane是否接收CTreeCtrl的ON_NOTIFY_REFLECT消息?,winapi,visual-c++,mfc,message-map,Winapi,Visual C++,Mfc,Message Map,MFC向导使用CWorkSpaceBar创建了一个项目,在我的例子中,该项目实际上是基于cbcgpDockControlBar,MFC等价物是CDockablePane。向导还基于CBCGPTreeCtrl(CTreeCtrl)创建了一个m_wndTree。它在其OnCreate()中创建了它,如下所示: CRect rectDummy; rectDummy.SetRectEmpty(); // Create tree control: const DWORD dwViewStyle =

MFC向导使用
CWorkSpaceBar
创建了一个项目,在我的例子中,该项目实际上是基于
cbcgpDockControlBar
,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)

但是,我没有收到通知消息?我还需要做些什么来让它工作吗?

您似乎混淆了NOTIFY\u REFLECT上的
和NOTIFY上的
处理程序;或者更确切地说,应该为其定义这些处理程序的窗口

根据您的描述,您的
CWorkSpaceBar
类/对象是树状视图(
CTreeCtrl
)对象的父对象;因此,当在该树视图中展开某个项时,该父窗格将接收一条
WM\u NOTIFY
消息,并调用相关的
ON\u NOTIFY
处理程序(如果在消息映射中定义)。ON\u NOTIFY\u REFLECT
处理程序允许实际树视图本身拦截/接收通知

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

通知上的
(TVN\U项目扩展、IDR\U USRTV和用户窗格::OnItemExpand)
注意:
IDR_USRTV
是我在树视图的
Create
函数中给它的ID值,如下所示;在示例代码中,您使用了
1
(这可能是可取的,也可能是不可取的)

int UserPane::OnCreate(CREATESTRUCT*pCreateStruct)
{
更正rc;rc.SetRectEmpty();
const DWORD trvstyle=WS|u CHILD | WS|u VISIBLE|
TVS|U系列| TVS|U系列根| TVS|U按钮| TVS|U SHOWSELALWAYS | TVS|U编辑标签;
if(CDockablePane::OnCreate(pCreateStruct)=-1)返回-1;
if(!m_wndTView.Create(trvstyle,rc,this,IDR_USRTV))返回-1;
//...
OnItemExpand
成员函数的基本概述如下:

void UserPane::OnItemExpand(NMHDR*pNotifyStruct,LRESULT*result)
{
*结果=0;
NMTREEVIEW*pTV=重新解释强制转换(pNotifyStruct);
HTREEITEM hItem=pTV->itemNew.hItem;
uintptpr_t itemData=m_wndTView.GetItemData(hItem);
如果(pTV->action==TVE\u EXPAND){
//...
}
否则如果(pTV->action==TVE\U崩溃){
//...
}
返回;
}

我刚刚从另一个项目中取出了
上的
,该项目是
CTreeView
的一部分,然后将我已经拥有的旧Win32代码转换为MFC。对MFC来说仍然是新的!谢谢!!