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; } }
正好我也在学,所以就说的稍微详细一点吧: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
添加上下文菜单:选择Project\Add to Project\Components and Controls... 在弹出的对话框中打开Visual C++ Components文件夹,在显示的组件中选择Pop-up Menu项 出现的对话框选OK,在新弹出的Pop-up Menu对话框中选择你要出现右键菜单的类(一般为程序的某个基类),选确定会在所在的类中出现上面几位说的代码,自己看一下MSDN,不懂再问
{
// 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);
}
{
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;
}
}
ScreenPoint.x, ScreenPoint.y, pParentWnd);
的返回值的?他只出现在UINT Command = (UINT),最后他却用来swich....?
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
在弹出的对话框中打开Visual C++ Components文件夹,在显示的组件中选择Pop-up Menu项
出现的对话框选OK,在新弹出的Pop-up Menu对话框中选择你要出现右键菜单的类(一般为程序的某个基类),选确定会在所在的类中出现上面几位说的代码,自己看一下MSDN,不懂再问
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);