CTreeCtrl HitTest 返回 NULL MFC
Posted
技术标签:
【中文标题】CTreeCtrl HitTest 返回 NULL MFC【英文标题】:CTreeCtrl HitTest returning NULL MFC 【发布时间】:2014-05-28 13:09:18 【问题描述】:我正在使用 VS2008 开发 MDI 应用程序。我在一个对话框上创建了 2 个树控件。 当我右键单击时,第一个树控件显示一个菜单,但第二个树控件不显示。 这是我的代码:
BEGIN_MESSAGE_MAP(CSignalWindow, CFormView)
ON_NOTIFY(NM_RCLICK, IDC_TREE_PROCDATA_WR, &CSignalWindow::OnNMRClickTreeProcdataWr)
ON_NOTIFY(NM_RCLICK, IDC_TREE_PROCDATA_RD, &CSignalWindow::OnNMRClickTreeProcdataRd)
END_MESSAGE_MAP()
void CSignalWindow::OnNMRClickTreeProcdataRd(NMHDR *pNMHDR, LRESULT *pResult)
DisplayProcDataMenuItem(true);
*pResult = 0;
void CSignalWindow::OnNMRClickTreeProcdataWr(NMHDR *pNMHDR, LRESULT *pResult)
DisplayProcDataMenuItem(false);
*pResult = 0;
void CSignalWindow::DisplayProcDataMenuItem(bool bInput)
CProcDataTreeCtrl &tcProcDataRd = bInput ? m_tcProcDataRd : m_tcProcDataWr;
CPoint ptMousePos;
UINT uFlags;
HTREEITEM htItem;
ptMousePos = (CPoint) GetMessagePos(); ScreenToClient(&ptMousePos);
htItem = tcProcDataRd.HitTest( ptMousePos, &uFlags );
if (htItem == NULL && !(TVHT_ONITEM & uFlags))
return;
HTREEITEM nodSelected = tcProcDataRd.GetSelectedItem();
HTREEITEM parent = tcProcDataRd.GetParentItem(nodSelected);
if (tcProcDataRd.GetParentItem(parent) == NULL)
CMenu menu;
CMenu* pPopup;
// the font popup is stored in a resource
if (bInput)
menu.LoadMenu(IDR_MENU_PROCDATA_RD);
else
menu.LoadMenu(IDR_MENU_PROCDATA_WR);
pPopup = menu.GetSubMenu(0);
ClientToScreen(&ptMousePos);
pPopup->TrackPopupMenu( TPM_LEFTALIGN, ptMousePos.x, ptMousePos.y, this );
我的树控件派生自我的自定义类CProcDataTreeCtrl
,它进一步派生自CTreeCtrl
在第一个树控件的情况下,ptMousePos
的值很好,uFlags
的值在调用 TVHT_ONITEMLABEL
后为 TVHT_ONITEMLABEL
在第二个树控件的情况下,ptMousePos
值很好,uFlags
值是 TVHT_BELOW
和 HitTest
返回 NULL。
我无法了解导致此问题的原因。
感谢您的帮助,
尼朋
【问题讨论】:
【参考方案1】:ScreenToClient(&ptMousePos);
替换为:
tcProcDataRd.ScreenToClient(&ptMousePos);
可能第一个树控件位于对话框的右上角,因此您的代码可以正常工作。
【讨论】:
以上是关于CTreeCtrl HitTest 返回 NULL MFC的主要内容,如果未能解决你的问题,请参考以下文章