如何将浮动的弹出式菜单限制在某一范围内弹出,例如某个对话框中的listctrl(列表控件)的内容区域(非列头)。

解决方案 »

  1.   

    BOOL TrackPopupMenu ( 
    UINT nFlags, 
    int x, 
    int y, 
    CWnd* pWnd, 
    LPCRECT lpRect = 0 ); m_pListCtrl->GetClientRect( rect ),利用rect的位置控制x, y就可以了
      

  2.   

    BOOL TrackPopupMenuEx(
      HMENU hmenu,       
      UINT fuFlags,      
      int x,             
      int y,             
      HWND hwnd,         
      LPTPMPARAMS lptpm  
    );hwnd是谁的就在谁的里面弹出
      

  3.   

    使用函数:TrackPopupMenu 可以控制菜单显示的位置
      

  4.   

    新手上路,请多关照。
    fang_jb能否说的更详细点,hwnd如何获得,比如一个listctrl控件
      

  5.   

    CWnd::GetSafeHwnd()CListCtrl是从CWnd派生的,这样说总详细了吧
      

  6.   

    感谢fang_jb不厌其烦的回答。试了一下还不行,GetSafeHwnd()会出现运行错误(提示非法访问)。
      

  7.   

    CListCtrl  m_list;
    CWnd *wnd;
    HWND hWnd=m_list.GetSafeHwnd();
    wnd=m_list.GetOwner();//GetWindow(GW_OWNER)
    CRect rect;
    m_list.GetWindowRect(&rect);
    CPoint point;
    CMenu menu;
    CMenu *ptrMenu;
    ptrMenu=new CMenu;
    menu.LoadMenu(IDR_MENU1);
    ptrMenu=menu.GetSubMenu(0);
    ptrMenu->EnableMenuItem(ID_MENU1,MF_BYCOMMAND|MF_GRAYED);
    ptrMenu->EnableMenuItem(ID_MENU2,MF_BYCOMMAND|MF_ENABLED);
    ptrMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, rect.left ,rect.top ,wnd,&rect);
    TrackPopupMenu函数的参数可以自己看看MSDN上面的解释
      

  8.   

    HWND hWnd=m_list.GetSafeHwnd();
    是多余的,你可以删除不要
      

  9.   

    bingbing所说的只能将右键菜单固定在m_list的左上脚,我要的是右键菜单跟着鼠标跑,但在超出listctrl控件的范围外不弹出。
      

  10.   

    我的问题已经解决,Add to project->components and controls->Visual c++ component->pop up menu,再在TrackPopupMenu的参数x 和y中限制菜单弹出的位置。