我正在使用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
值为HitTest
在第二树控制的情况下,
ptMousePos
值很好,uFlags
值为TVHT_BELOW
,HitTest
返回NULL。
我无法理解造成这个问题的原因。
感谢您的帮助,
Nipun
答案 0 :(得分:1)
ScreenToClient(&ptMousePos);
替换为:
tcProcDataRd.ScreenToClient(&ptMousePos);
可能第一个树控件位于对话框的右上角位置,因此您的代码可以正常工作。