15.15 如何创建"上下文"式右键菜单
菜单常见的形式有两种,一种是在标题栏处的标准菜单样式,另外一种称之为"上下文"菜单,常常在右击时,在鼠标所在的位置弹出一个菜单,可以使用CMenu:: TrackPopupMenu函数来实现这一功能,步骤如下:
(1)创建一个基于对话框的、使用MFC库的Windows应用程序工程。
(2)使用向导实现主对话框类对消息WM_CONTEXTMENU的响应,向导添加类似下面的代码:
afx_msg void OnContextMenu(CWnd* pWnd, CPoint point); void CXXDlg::OnContextMenu(CWnd* pWnd, CPoint point) { // TODO: Add your message handler code here // TODO: Add your control notification handler code here } |
(3)在资源视图中插入一个MENU菜单,资源ID为IDR_MENU1,编辑菜单结构如图15.15所示。其中菜单项A、B、C的ID代码分别为ID_ MENUITEM_A、ID_MENUITEM_B、ID_MENUITEM_C。
(4)实现OnContextMenu函数的代码如下:
void CXXDlg::OnContextMenu(CWnd* pWnd, CPoint point) { // TODO: Add your message handler code here // TODO: Add your control notification handler code here CMenu menu; // 装入菜单 menu.LoadMenu(IDR_MENU1); // 显示菜单(第一个子菜单项) menu.GetSubMenu(0)->TrackPopupMenu( TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON, point.x, point.y, this); } |
(5)实现菜单项A、B、C的事件响应,在CXXDlg类头文件和cpp文件中添加如下代码:
//.h文件 afx_msg void OnMenuitemA(); afx_msg void OnMenuitemB(); afx_msg void OnMenuitemB(); //cpp文件 BEGIN_MESSAGE_MAP(CMFCDlg, CDialog) //{{AFX_MSG_MAP(CMFCDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_CONTEXTMENU() ON_COMMAND(ID_MENUITEM_A, OnMenuitemA) ON_COMMAND(ID_MENUITEM_B, OnMenuitemB) ON_COMMAND(ID_MENUITEM_C, OnMenuitemC) //}}AFX_MSG_MAP END_MESSAGE_MAP() void CXXDlg::OnMenuitemA() { // TODO: Add your command handler code here AfxMessageBox("A"); } void CXXDlg::OnMenuitemB() { // TODO: Add your command handler code here AfxMessageBox("B"); } void CXXDlg::OnMenuitemC() { // TODO: Add your command handler code here AfxMessageBox("C"); } |
(6)按Ctrl+F5键编译并运行程序。
注意:除了本节中介绍的使用WM_CONTEXTMENU消息响应函数来显示动态创建的菜单之外,还有另外一种方法可以使用,而且更加的灵活,即响应鼠标右击消息,然后处理右击消息的函数体内调用相关函数获得鼠标的位置,再创建CMenu对象,调用成员函数TrackPopupMenu来显示创建的上下文菜单。
【责任编辑:
夏书 TEL:(010)68476606】