C++中CMenu菜单消息如何响应
发布网友
发布时间:2022-04-23 18:07
我来回答
共2个回答
热心网友
时间:2023-08-22 12:19
调用CMenu的成员函数 TrackPopupMenu,
参数 uFlags 中添加 TPM_RETURNCMD 标志,这样函数的返回值就是用户选择的菜单ID,
只要把返回值与 IDM_OPENITEM 比较就知道是否选择了这个菜单项
id = menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RETURNCMD | TPM_RIGHTBUTTON,
ptScreen.x, ptScreen.y, this);
if (id != IDM_OPENITEM) {
...
ShellExecute(...);
}
热心网友
时间:2023-08-22 12:20
这个比较难,要用点trick,而且要针对很多OS测试一下。
可以参考以下的代码:
POPUP时:
CMenu menu;
menu.LoadMenu(MAKEINTRESOURCE(IDR_MENU1));
PostMessage(WM_USER+1, 0, 0);
menu.GetSubMenu(0)->TrackPopupMenu(0, 100, 100, this, NULL);
响应WM_USER+1消息时:
class CMyMenu : public CWnd
{
protected:
virtual LRESULT WindowProc(
UINT message,
WPARAM wParam,
LPARAM lParam
) {
if (message == 485) {
printf("%d'th item is selected\n", wParam);
}
return CWnd::WindowProc(message, wParam, lParam);
}
};
LRESULT CXXXDlg::OnFindMenu(WPARAM, LPARAM)
{
// 注意:这里应该再详细判断一下
HWND hwnd = ::FindWindow(_T("#32768"), NULL);
if (!hwnd) {
PostMessage(WM_USER+1, 0, 0);
return 0;
}
CMyMenu* newMenu = new CMyMenu();
newMenu->SubclassWindow(hwnd);
return 0;
}