C++中CMenu菜单消息如何响应

CMenumenu;menu.CreatePopupMenu();//声明一个弹出式菜单//增加菜单项menu.AppendMenu(MF_STRING|MF_ENABL... CMenu menu;menu.CreatePopupMenu();//声明一个弹出式菜单//增加菜单项 menu.AppendMenu(MF_STRING|MF_ENABLED,IDM_OPENITEM,"打开小助手"); menu.AppendMenu(MF_STRING,WM_DESTROY,"关闭");其中,鼠标左键选择"打开小助手"后,我想调用其他程序,程序目录为E:\CHLQY\bins\CHLQY.exe如何实现呀?我知道用ShellExecute(……),但是怎么判断手表点击的是“打开小助手”项呢? 展开
 我来答
百度网友6eab688
2012-08-25 · TA获得超过4691个赞
知道大有可为答主
回答量:962
采纳率:50%
帮助的人:947万
展开全部
调用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(...);
}
匿名用户
推荐于2016-04-21
展开全部
这个比较难,要用点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;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式