一、定义右键菜单功能项对应的自定义消息
示例:
#define WM_RMENU_CMD_TEST_1 WM_USER + 0x010
#define WM_RMENU_CMD_TEST_2 WM_USER + 0x011
#define WM_RMENU_CMD_TEST_3 WM_USER + 0x012
二、添加对话框的WM_RBUTTONDOWN消息响应
afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
BEGIN_MESSAGE_MAP(CDemoDlg, CDialog)
ON_WM_RBUTTONDOWN()
END_MESSAGE_MAP()
void CDemoDlg::OnRButtonDown(UINT nFlags, CPoint point)
{
CMenu menu;
menu.CreatePopupMenu();
menu.AppendMenu(MF_STRING, WM_RMENU_CMD_TEST_1, "Test 1");
menu.AppendMenu(MF_STRING, WM_RMENU_CMD_TEST_1, "Test 2");
menu.AppendMenu(MF_STRING, WM_RMENU_CMD_TEST_1, "Test 3");
POINT tpoint;
tpoint.x = point.x;
tpoint.y = point.y;
ClientToScreen(&tpoint);
menu.TrackPopupMenu(TPM_LEFTALIGN, tpoint.x, tpoint.y, this);
CDialog::OnRButtonDown(nFlags, point);
}
三、添加菜单项的响应代码
virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
BOOL CDemoDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
switch(LOWORD(wParam))
{
case WM_RMENU_CMD_TEST_1:
AfxMessageBox("Test_1");
break;
case WM_RMENU_CMD_TEST_2:
AfxMessageBox("Test_2");
break;
case WM_RMENU_CMD_TEST_3:
AfxMessageBox("Test_3");
break;
default:
break;
}
return CDialog::OnCommand(wParam, lParam);
}
四、注意
1.需不需要调用DestroyMenu释放资源?
我们看下CMenu的析构函数
_AFXWIN_INLINE CMenu::~CMenu()
{ DestroyMenu(); }
它本身是有释放资源的。