在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环境中创建和使用弹出菜单,无论是鼠标左键还是右键触发,甚至针对不同控件实现不同的菜单。这使得我们能够为用户提供更加丰富的交互体验。