步骤:
(1) 创建一个基于对话框的应用程序
(2)在工作区选择资源视图,插入一个菜单资源,添加菜单项
(3)在对话框的头文件中声明一个CMenu类对象m_Menu
(4)在OnInitDialog方法中调用LoadMenu方法加载菜单资源
m_Menu.LoadMenuW(IDR_MENU1); //加载菜单资源
(5)在工作区窗口选择类视图,右击CXXXDlg节点,选择类向导,在弹出的对话框中选择消息,WM_RBUTTONUP事件,改事件在右键抬起时触发
(6)处理鼠标右键抬起时的事件处理函数
void CMy82Dlg::OnRButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CMenu *pMenu = m_Menu.GetSubMenu(0); //获得菜单句柄
CRect rect;
ClientToScreen(&point); //将客户坐标转换为屏幕坐标
rect.top = point.x; //将鼠标当前横坐标作为弹出菜单的左上角坐标
rect.left = point.y; //将鼠标当前纵坐标作为弹出菜单的左上角坐标
pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON|TPM_VERTICAL,rect.top,rect.left,this,&rect); //显示弹出菜单
CDialogEx::OnRButtonUp(nFlags, point);
}
注意在显示弹出菜单时,使用ClientToScreen函数进行转换,否则弹出菜单的位置可能出错.
效果如下:
用到的函数:
LoadMenu方法:
语法格式如下
BOOL LoadMenu(LPCTSTR lpszResourceName);
BOOL LoadMenu(UINT nIDResource);
lpszResourceName:标识资源名称
nIDResource: 标识资源ID
GetSubMenu方法获得弹出式菜单第一个项
CMenu* GetSubMenu(int nPos) const;
nPos:标识菜单位置,第一个菜单项对应的位置是0,第2个菜单项的对应位置是1,依次类推.
TrackPopupMenu方法
语法格式如下:
BOOL TrackPopupMenu(UINT nFlags, int x, int y,CWnd* pWnd, LPCRECT lpRect = 0);
nFlags:屏幕标记和鼠标按钮标记
x:以屏幕坐标标识弹出菜单式菜单的水平坐标
y:以屏幕坐标标识弹出菜单式菜单的水平坐标
pWnd:标识弹出式菜单的所有者
IpRect:以屏幕坐标表示用户在菜单中的单击区域,如果为NULL,当用户单击弹出式菜单之外的区域,将释放菜单窗口
nFlags的可选值
定位快捷菜单中的水平位置:
TPM_CENTERALIGN 中心由x参数指定的坐标水平相对快捷菜单
TPM_LEFTALIGN 定位快捷菜单,以便其左侧参数指定的坐标对齐
TPM_RIGHTALIGN 参数指定的快捷菜单,以便其右侧对齐。
定位快捷菜单垂直位置:
TPM_BOTTOMALIGN 位置的快捷菜单中,其底部的参数y指定的坐标对齐。
TPM_TOPALIGN 位置的快捷菜单,以便其顶侧的参数y指定的坐标对齐
TPM_VCENTERALIGN 中心 y所指定的坐标垂直的快捷菜单
使用下列标志指定的鼠标按钮的快捷菜单轨道。
TPM_LEFTBUTTON 用户可以选择菜单项,用鼠标左键。
TPM_RIGHTBUTTON 用户可以选择左,右鼠标按钮的菜单项。