TrackPopupMenu弹出菜单后父窗口的消息响应问题

努力学习_提高自己 2011-12-07 05:19:49
我在程序中制作了一个菜单项,但是不是直接用来放到对话框上的
我在对话框上输出了几个词组,当鼠标点击文字时,将在对应文字下方弹出菜单
弹出菜单的代码如下

m_nMenuSel = MenuItemChecked(hWnd, point); // 判断是否点击文字。返回文字在数组中的索引
if(-1 != m_nMenuSel)
{
CMenu menu;
menu.LoadMenu(IDR_MENU2);
CMenu *pPopup = menu.GetSubMenu(m_nMenuSel);
CPoint ptMenu;
ptMenu.x = m_rcMenu[m_nMenuSel].left;
ptMenu.y = m_rcMenu[m_nMenuSel].bottom;
ClientToScreen(hWnd, &ptMenu);
//SetForegroundWindow(hWnd);
pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_VERTICAL,ptMenu.x,ptMenu.y,NULL);

//SetFocus(hWnd);

return TRUE;
}


弹出正常,问题就在于,当弹出菜单后,窗口的消息就由当前菜单来处理了,鼠标移动等消息捕获不到了

我想做成一般菜单的那种,鼠标滑过哪个菜单项就在其下弹出其对应菜单。
而现在弹出菜单后,除非点击窗口,不然鼠标消息捕获不到··代码中
SetForegroundWindow(hWnd);
试过了,没有效果··

请问该如何解决呢?
...全文
895 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
linyongzuo 2011-12-09
  • 打赏
  • 举报
回复
可以画。你处理Mousemove事件,每个菜单有个rect区域和Id,经过的时候判断是哪个rect,然后弹出哪个菜单,颜色可以在onpaint填充,或者贴图
  • 打赏
  • 举报
回复
其实效果也是跟系统默认一样,比方说IE浏览器或者360浏览器等,菜单栏点击弹出菜单后,滑过菜单条的时候会自动弹出和消失对应的菜单。
我现在做的操作是,点击菜单后从资源菜单中加载了我的菜单,然后使用TrackPopupMenu显示了出来。
这个时候,我想要的操作是,鼠标进入其他菜单项时,像系统默认菜单那样自动弹出。
现在的问题就是,我弹出菜单后,如何能获取鼠标移出了我指定的区域的消息呢?
因为我在弹出菜单后,获取不到mousemove消息了。是因为TrackPopupMenu函数的原因吗?或者有其他的方式来实现我的目的呢?
ps:我的对话框属性是无边框的,标题栏是自绘的,在鼠标消息里判断是否在标题栏区域内来发送对应的NC消息
baby393 2011-12-09
  • 打赏
  • 举报
回复
也可以用EndMenu()API来销毁菜单
baby393 2011-12-09
  • 打赏
  • 举报
回复
菜单是模式窗口,你需要HOOK它,在HOOK里面要使已经弹出的菜单自动消失,给它发送WM_CANCELMODE消息。

// 在弹出菜单之前先HOOK菜单。
HOOK hHook = SetWindowsHookEx(WH_MSGFILTER, HookProc, NULL, GetCurrentThreadId);
TrackPopupMenu(...);
UnhookWindowsHookEx(hHook);
LRESULT CALLBACK HookProc(int code, WPARAM wParam, LPARAM lParam)
{
if (code == MSGF_MENU)
{
MSG* pMsg = (MSG*)lParam;
if (pMsg->msg == WM_MOUSEMOVE)
{
// 计算坐标,当鼠标到了某个位置需要销毁菜单时,给拥有菜单的窗口发送WM_CANCELMODE消息。
}
}
}
return CallNextHookEx(NULL, code, wParam, lParam);
}
  • 打赏
  • 举报
回复
TrackPopupMenu弹出菜单后,当前的菜单将成为活动窗口,消息都由此菜单窗口接收,我在TrackPopupMenu菜单的时候也试过setfocus和SetForegroundWindow,但是对话框还是没有接收到鼠标的消息。

  • 打赏
  • 举报
回复
[Quote=引用 8 楼 linyongzuo 的回复:]

可以画。你处理Mousemove事件,每个菜单有个rect区域和Id,经过的时候判断是哪个rect,然后弹出哪个菜单,颜色可以在onpaint填充,或者贴图
[/Quote]
我说了那么多,表达不够清楚吗??
我现在的问题就是弹出了菜单后,mousemove消息获取不到了!!
不管是setfoucs还是什么函数,都没有能让我的对话框再接受到mousemove消息,要是能处理消息我早就解决了
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jennyvenus 的回复:]
引用 3 楼 jiratao 的回复:
嗯,大致思路也是这样,我现在的问题是,在点击弹出了菜单后,鼠标的消息我捕获不到了


默认的菜单也是这样吧
[/Quote]
可是我现在做的不要默认菜单的效果哇···
就像迅雷的标题栏上的菜单那样,很多软件都有那种菜单效果,应该不难实现吧···
可是我就是获得不了他的消息啊·
用户 昵称 2011-12-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jiratao 的回复:]
嗯,大致思路也是这样,我现在的问题是,在点击弹出了菜单后,鼠标的消息我捕获不到了
[/Quote]

默认的菜单也是这样吧
shiyunqiang 2011-12-08
  • 打赏
  • 举报
回复
使用SetFocus();
是主窗口重新获得焦点。
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jennyvenus 的回复:]
如果一个菜单点击之后,没有点击过其他地方,那么当鼠标滑出菜单区域时,菜单会自动消失,鼠标再进入菜单时,菜单会自动弹出。

点击过其他地方之后,鼠标再次滑过菜单,菜单不弹出。
[/Quote]
嗯,大致思路也是这样,我现在的问题是,在点击弹出了菜单后,鼠标的消息我捕获不到了
用户 昵称 2011-12-08
  • 打赏
  • 举报
回复
如果一个菜单点击之后,没有点击过其他地方,那么当鼠标滑出菜单区域时,菜单会自动消失,鼠标再进入菜单时,菜单会自动弹出。

点击过其他地方之后,鼠标再次滑过菜单,菜单不弹出。
  • 打赏
  • 举报
回复
没人知道吗??
我就想实现像迅雷或者其他软件那样,在自己绘制的标题栏上添加一组菜单按钮,鼠标点击弹出一个菜单后,鼠标滑过某个菜单按钮就自动弹出菜单,这样的效果。
求指导,求解决

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧