如何在VC中实现右击鼠标后弹出快捷菜单?

解决方案 »

  1.   

    see:   OnContextMenu()  TrackPopupMenu()
      

  2.   

    void CXXXXXXXXXX::OnContextMenu(CWnd* pWnd, CPoint point) 
    {
    // TODO: Add your message handler code here
    CMenu menu,*pm;
    menu.LoadMenu(IDR_MENU_POPUP);
    pm=menu.GetSubMenu(0);
    pm->TrackPopupMenu(TPM_LEFTBUTTON|TPM_RIGHTBUTTON, point.x, point.y, this);
    }
      

  3.   

    void MyWindow::OnRButtonDown(UINT nFlags, Cpoint point)
    {
        Cpoint ScreenPoint;
        //calculate where the menu should appear, in SCREEN COORDINATES
        //计算在整个屏幕上的位置,否则点的位置是指用户区域的位置
        ScreenPoint = point;
        ClientToScreen(&ScreenPoint);    UINT CommandId = 0;
        Cmenu MyContextMenu;
        MyContextMenu.CreatePopupMenu();
        MyContextMenu.AppendMenu(MF_STRING, ++CommandId, "Command1");
        MyContextMenu.AppendMenu(MF_STRING, ++CommandId, "Command2");
        MyContextMenu.AppendMenu(MF_STRING, ++CommandId, "Command3");
        MyContextMenu..AppendMenu(MF_STRING, ID_SEPARATOR); //to get separator line
        MyContextMenu.AppendMenu(MF_STRING, ++CommandId, "Command4");
        //... (Append as many commands as you like)
        //指定菜单的类型.
        UINT Command = (UINT)
    MyContextMenu.TrackPopupMenu(TPM_LEFTALIGN|TPM_NONOTIFY | TPM_RETURNCMD,
    ScreenPoint.x, ScreenPoint.y, pParentWnd);
        //使用TPM_NONOTIFY | TPM_RETURNCMD返回被选择的菜单命令,0代表没有(比如
        //点击菜单外面)
        //using TPM_NONOTIFY | TPM_RETURNCMD returns the chosen command, 0
    for no command (e.g. Clicking outside the context menu)
        //如果你不加入这两个类型,你的父窗口将会从你选的命令中收到WM_COMMAND消息
        //if you don't use these two styles, your pParentWnd gets WM_COMMAND
    messages for the chosen commands    MyContextMenu.DestroyMenu();    //switch is only necessary if you use TPM_NONOTIFY | TPM_RETURNCMD !
        //switch只在你使用两种类型时才有必要.
        Switch(Command)
        {
        case 0:
        //no command, so do nothing
        //没有命令,所以不必做任何事情.
        Break;
        case 1:
        //whatever
        break;
        case 2:
        //whatever
        break;
        case 3:
        //whatever
        break;
        case 4:
        //whatever
        break;
        //... There should be one case for each command
        default:
        //just in case I forget to implement a command
        ASSERT(0);
        break;
        }
    }
      

  4.   

    Command 是怎么得到MyContextMenu.TrackPopupMenu(TPM_LEFTALIGN|TPM_NONOTIFY | TPM_RETURNCMD,
    ScreenPoint.x, ScreenPoint.y, pParentWnd);
        的返回值的?他只出现在UINT Command = (UINT),最后他却用来swich....?
      

  5.   

    正好我也在学,所以就说的稍微详细一点吧:VC++6.0   将右键菜单作为一个常用的组件提供给用户,组件被存放在Component Gallary里具体来说,为一个工程添加一个右键菜单,希望用户在视图区单击鼠标右键的时候弹出一个快捷菜单。1。打开工程,单击project|add to project|components and controls...,弹出组件和控件画廊对话框
    2。双击VisualC++Components目录,选择pop-up menu组件
    3。单击insert
    4。确定,在弹出的菜单里选择:add popup menu to:选择视类
                               menu resouce  ID:默认
    此时,右键菜单已经加入,但是没有对应的消息处理函数,所以是灰的打开resource view,找到这个菜单资源,修改菜单项,用class view浏览视类,发现增加了一个OnContextMenu的成员函数,它是CWnd的一个方法,用于处理鼠标右键单击,对应的Windows消息为WM_CONTEXTMENU
      

  6.   

    添加上下文菜单:选择Project\Add to Project\Components and Controls...
    在弹出的对话框中打开Visual C++ Components文件夹,在显示的组件中选择Pop-up Menu项
    出现的对话框选OK,在新弹出的Pop-up Menu对话框中选择你要出现右键菜单的类(一般为程序的某个基类),选确定会在所在的类中出现上面几位说的代码,自己看一下MSDN,不懂再问
      

  7.   

    右键消息
    CMenu menu;
    CPoint point;
    menu.LoadMenu(IDR_MENU1);
    CMenu *pMenu=menu.GetSubMenu(1);
    CMenu *pMenu1=menu.GetSubMenu(0);
    //CMenu *pMenu=menu.GetDefaultItem(GMDI_GOINTOPOPUPS, TRUE == -1);
    ASSERT(pMenu!=NULL);
    ClientToScreen(&point);
    //pMenu->TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON,600,200,this);
    pMenu1->TrackPopupMenu(TPM_RIGHTBUTTON,180,200,this);