MFC: CDockablePane接收ON_NOTIFY_REFLECT消息为CTreeCtrl?



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 viewn");
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处理程序;或者更确切地说,应该为那些处理程序定义的Windows。

从你所描述的,你的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;
}

相关内容

  • 没有找到相关文章

最新更新