我在程序里加了DialogBar,并在上面加了TreeControl,想实现右键弹出菜单,在RClick消息响应函数里加如下代码:
         CMenu m_menu;
m_menu.LoadMenu(IDR_DIALOGBOXPOP);
CPoint pt;
GetCursorPos(&pt);
CMenu* m_sub = m_menu.GetSubMenu(0);
m_sub->TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this);
可以实现功能,然后我想添加一个功能就是左键选中一个Item后,如果右键选的不是左键选中的Item就return,就添加了下列代码:
CTreeCtrl* m_treeFrame = (CTreeCtrl*)m_wndMyDialogBar.GetDlgItem(IDC_TREEFRAME); HTREEITEM m_item = m_treeFrame->GetSelectedItem();
UINT uFlags;
HTREEITEM m_hititem = m_treeFrame->HitTest(pt,&uFlags);
if(m_item!=m_hititem) return;
结果就弹不出来菜单了,大家帮我看看为什么?

解决方案 »

  1.   

    pt是屏幕坐标,用ScreenToClient转换成客户坐标就好了
    good luck!
      

  2.   

    我用ScreenToClient了,可还是不行。
    单步跟踪时,发现m_hititem是0值。这是怎么回事阿?
      

  3.   

    CPoint pt;
    GetCursorPos(&pt);
    ScreenToClient(&pt);
      

  4.   

    我的代码:
             CMenu m_menu;
    m_menu.LoadMenu(IDR_DIALOGBOXPOP); CTreeCtrl* m_treeFrame = (CTreeCtrl*)m_wndMyDialogBar.GetDlgItem(IDC_TREEFRAME); HTREEITEM m_item = m_treeFrame->GetSelectedItem();
    CPoint pt;
    GetCursorPos(&pt);
    ScreenToClient(&pt);
    UINT uFlags;
    HTREEITEM m_hititem = m_treeFrame->HitTest(pt,&uFlags);
    if(m_item!=m_hititem) return;
    CMenu* m_sub = m_menu.GetSubMenu(0); m_sub->TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this);
    就是出不来,我快气死了!!
      

  5.   

    你的鼠标右击应该是在这个树星控件中来完成的吧,但是当你的鼠标移动的树形控件的时候
    pt保存是其父窗口的位置坐标,需要在你的从新派生一个树形的控件然后在派生的类当中
    对wm_rbuttondown从新加代码,设定pt ,不知道清楚不在控件的区域父窗口wm_rbuttondown
    被分配到控件中去了
    所以在父窗口中是无法实现该代码的执行
      

  6.   

    同意楼上的说法,处理控件的RCLICK.
    这种问题可能是处理鼠标消息时,鼠标的位置改变了,不再是点击时的位置。
      

  7.   

    to woaini5994(坚持到底) :
    "需要在你的从新派生一个树形的控件然后在派生的类当中
    对wm_rbuttondown从新加代码" 不太明白。
    我是把IDC_TREE加到了MainFrame里了,在MainFrame里响应控件的NM_RCLICK消息。
      

  8.   

    如果是按钮的话
    就以CBUTTON 作为基类派生一个新的类 然后在定义变量的时候,选择新定义的类定义成CONTRL形