嗨:yu_hl(卖火柴的小男孩) 
我用你的方法出现了非法操作
CMenu Menu;
Menu.LoadMenu(IDR_MENU1);
LPPOINT p;
    GetCursorPos(p);
Menu.GetSubMenu(0)->
TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON,p->x, p->y,this);

解决方案 »

  1.   

    POINT p;
    GetCursorPos(&p);
      

  2.   

    改改
    CPoint p;
    GetCursorPos(&p);
      

  3.   

    LPPOINT p = new POINT;
    GetCursorPos(p);明白了吗?访问没有分配的指针就会非法操作
    当然,用LPPOINT还要delete
    所以就用POINT好了
      

  4.   

    我现在又发现新问题了:
    在CTreeCtrl里的任何地方点右键都会出菜单的。我添加了一下代码但在CTreeCtrl的空白地方点右键时Hitem不等NULL,而是CTreeCtrl的第一级树
    HTREEITEM Hitem;
    Hitem=m_Tree.GetSelectedItem();
    if(Hitem!=NULL)
    {

                      CMenu Menu;
    Menu.LoadMenu(IDR_MENU1);
    CPoint p;
    GetCursorPos(&p);
    Menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON,p.x, p.y,this); }
      

  5.   

    void CMyView::OnRButtonDown(UINT nFlags, CPoint point) 
    {
    CPoint pt;
    CMenu menu;
    CTreeCtrl& cThisTree = GetTreeCtrl(); HTREEITEM SelItem = cThisTree.HitTest( point,  &nFlags ); if (SelItem == NULL)  return ;//未选中树形控件,则返回 cThisTree.SelectItem(SelItem) ;//取得当前所选节点 menu.CreatePopupMenu();
    menu.AppendMenu(0,ID_USER1,"菜单一");
    menu.AppendMenu(0,ID_USER2,"菜单二");
    GetCursorPos(&pt);
    menu.TrackPopupMenu(TPM_RIGHTBUTTON,pt.x,pt.y,this);
    ptAction=pt;}
      

  6.   

    我这样实现有问题吗?但是还是不行的。
    void CTreeDlg::OnRclickTree1(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    CPoint pt;
    CMenu menu;
    UINT nFlags;         HTREEITEM SelItem = m_Tree.HitTest( pt,  &nFlags );
    if (SelItem == NULL)  return ;//未选中树形控件,则返回
    m_Tree.SelectItem(SelItem) ;//取得当前所选节点 menu.CreatePopupMenu();
    menu.AppendMenu(0,IDR_MENU1,"菜单一");
    GetCursorPos(&pt);
    menu.TrackPopupMenu(TPM_RIGHTBUTTON,pt.x,pt.y,this);
    *pResult = 0;
    }
      

  7.   

    应该在OnRButtonDown事件中处理,OnRclick要求必须在控件内部右键点击才会触发该事件,而现在我们在右键事件中检测右键是否点击在控件上
    所以推荐你在OnRButtonDown中加入以上代码。
      

  8.   

    还是不行,我忘了告诉你,我的应用程序是基于对话框的。所以CTreeCtrl& cThisTree = GetTreeCtrl();是不行的。
    你的ptAction=pt;是干什么用的?