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_BELOWHitTest 返回 NULL。

我无法了解导致此问题的原因。

感谢您的帮助,

尼朋

【问题讨论】:

【参考方案1】:
ScreenToClient(&ptMousePos);

替换为:

tcProcDataRd.ScreenToClient(&ptMousePos);

可能第一个树控件位于对话框的右上角,因此您的代码可以正常工作。

【讨论】:

以上是关于CTreeCtrl HitTest 返回 NULL MFC的主要内容,如果未能解决你的问题,请参考以下文章

iOS响应链原理

取消手势识别器后以编程方式启动 hitTest:WithEvent 并返回不同的 UIView 以响应事件

hitTest方法与PointInside方法

hitTest:withEvent源码分析

MFC之TreeCtrl遍历所有节点

CTreeCtrl - 获取项目位置