VC弹出菜单制作
在VC++环境中,创建弹出菜单是开发GUI应用程序的一个常见需求。通过使用MFC(Microsoft Foundation Classes)库,我们可以方便地实现这一功能。本篇将详细介绍如何在VC++下使用MFC来创建和使用弹出菜单,以及如何针对不同的触发事件(如鼠标左键或右键点击)显示不同的菜单。 我们从新建一个基于对话框的MFC应用程序开始。假设我们已创建了一个名为`PopupMenu`的项目,并在资源编辑器中添加了ID为`IDR_MENU1`的菜单资源,以及一个ID为`IDB_BITMAP1`的位图资源用于设置菜单项的图标。 接下来,我们需要编写代码来处理鼠标点击事件。在对话框类`CPopupMenuDlg`中,为`WM_LBUTTONDOWN`消息(左键点击)添加处理函数`OnLButtonDown`。在这个函数中,我们首先加载菜单资源`IDR_MENU1`到`CMenu`对象`menu`,然后加载位图资源`IDB_BITMAP1`到`CBitmap`对象`m_bitmap1`。接着,我们获取弹出菜单的第一个子菜单`pPopupMenu`,并为菜单的第一项和第三项设置图标。我们将鼠标点击位置转换为屏幕坐标,并调用`TrackPopupMenu`函数弹出菜单。 以下是`OnLButtonDown`函数的示例代码: ```cpp void CPopupMenuDlg::OnLButtonDown(UINT nFlags, CPoint point) { CMenu menu; CMenu* pPopupMenu; CBitmap m_bitmap1; menu.LoadMenu(IDR_MENU1); m_bitmap1.LoadBitmap(IDB_BITMAP1); pPopupMenu = menu.GetSubMenu(0); pPopupMenu->SetMenuItemBitmaps(0, MF_BYPOSITION, &m_bitmap1, &m_bitmap1); pPopupMenu->SetMenuItemBitmaps(2, MF_BYPOSITION, &m_bitmap1, &m_bitmap1); ClientToScreen(&point); pPopupMenu->TrackPopupMenu(TPM_BOTTOMALIGN, point.x, point.y, this, NULL); CDialog::OnLButtonDown(nFlags, point); } ``` 对于右键点击事件,例如在`CListCtrl`控件中的条目上弹出菜单,我们需要重载`NM_RCLICK`消息。下面是一个例子,演示如何在列表控件中实现这一功能: ```cpp void CMyListCtrl::OnRButtonDown(UINT nFlags, CPoint point) { CMenu menu; menu.LoadMenu(IDR_MENU2); // 使用不同的菜单资源,比如 IDR_MENU2 CMenu* pMenu = menu.GetSubMenu(0); CPoint pos = point; pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pos.x, pos.y, AfxGetMainWnd()); } ``` 对于对话框上的右键点击事件,如果想要在任何位置都能弹出菜单,可以在对话框类中声明一个`CMenu`变量,并在构造函数中加载菜单资源。然后,在`OnRButtonDown`函数中,根据鼠标点击位置显示菜单: ```cpp class CMyDlg : public CDialogEx { public: CMenu m_Popmenu; CMyDlg(CWnd* pParent = nullptr) : CDialogEx(IDD_MYDLG, pParent) { m_Popmenu.LoadMenu(IDR_MENU1); } protected: afx_msg void OnRButtonDown(UINT nFlags, CPoint point); DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(CMyDlg, CDialogEx) ON_WM_RBUTTONDOWN() END_MESSAGE_MAP() void CMyDlg::OnRButtonDown(UINT nFlags, CPoint point) { m_Popmenu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this); } ``` 通过上述步骤,我们可以灵活地在VC++ MFC环境中创建和使用弹出菜单,无论是鼠标左键还是右键触发,甚至针对不同控件实现不同的菜单。这使得我们能够为用户提供更加丰富的交互体验。
- 普通网友2013-09-20写得不太详细,最好有工程阿
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助