CTreeCtrl HitTest返回NULL MFC

时间:2014-05-28 13:09:19

标签: visual-c++ visual-studio-2008 mfc

我正在使用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_BELOWHitTest返回NULL。

我无法理解造成这个问题的原因。

感谢您的帮助,

Nipun

1 个答案:

答案 0 :(得分:1)

ScreenToClient(&ptMousePos);

替换为:

tcProcDataRd.ScreenToClient(&ptMousePos);

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