如果用简单的WM_Message效果很不正常。例如我在WM_CONTEXTMENU消息里写弹出一个对话框,实际上就得双击才能弹出来。如果写弹出一个菜单,代码是执行了,但菜单没出来。另外如何让CTreeView接受双击某一节点的消系?

解决方案 »

  1.   

    右击显示菜单:
    void CLayerVisibleDlg::OnRclickLayersTree(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    // TODO: Add your control notification handler code here
    CPoint pt;
    ::GetCursorPos(&pt);
    UINT uFlags=0;
    RECT rect;
    m_pTree.GetWindowRect( &rect );
    CPoint ptTest;
    ptTest.x = pt.x - rect.left ;
    ptTest.y = pt.y - rect.top ;
    HTREEITEM hItem = m_pTree.HitTest(ptTest,&uFlags);
    if (hItem!=NULL)
    {
    if( uFlags & TVHT_ONITEMLABEL )  //选中了Label
    {
    int count = -1;
    for (int i = 0 ;i < 3 ; i++)
    {
    if (hItem == m_hRoot[i])
    {
    count = i;
    break;
    }
    } if (count == -1)//选中非根节点
    {
    LyrName = m_pTree.GetItemText(hItem);
    CMenu menu;
    menu.LoadMenu(IDR_LyrZoom);
    CMenu* p = menu.GetSubMenu(0); CPoint pt;
    ::GetCursorPos(&pt);
    p->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_VERTICAL,pt.x, pt.y, this);
    *pResult = 0;
    }
    }
    }
    }双击:
    直接使用WM_LBUTTONLCLK事件,然后检测点击中的节点:
    {
    CPoint pt;
    ::GetCursorPos(&pt);
    UINT uFlags=0;
    RECT rect;
    m_pTree.GetWindowRect( &rect );
    CPoint ptTest;
    ptTest.x = pt.x - rect.left ;
    ptTest.y = pt.y - rect.top ;
    HTREEITEM hItem = m_pTree.HitTest(ptTest,&uFlags);
    if (hItem!=NULL)
    {
    if( uFlags & TVHT_ONITEMSTATEICON )
    {
    int count = -1;
    for (int i = 0 ;i < 3 ; i++)
    {
    if (hItem == m_hRoot[i])
    {
    count = i;
    break;
    }
    } if (count != -1)//选中根节点
    {
    }
    else//非根节点
    {
    ......