响应WM_MOUSEHOVER无法显示窗口?响应WM_MOUSELEAVE可以隐藏窗口

ronaldo07 2008-11-07 03:17:14
先创建一个对话框CTestDlg,然后在CTestDlg上面显示CS_CHlLD的CShowDlg对话框。

当鼠标没有在CShowDlg上2秒就自动隐藏CShowDlg。当鼠标移到CShowDlg区域,显示该对话框。
就像很多视频播放器的控制工具条。

本人出来WM_MOUSELEAVE和WM_MOUSEHOVER,但是当鼠标移到CShowDlg外隐藏该对好框之后,鼠标再移回来就无法再显示。
难道无法获得该对话框区域??
我知道在父类CTestDlg中可以实现,但现在想在OnMouseHover中实现。高手帮帮。


void CShowDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (!m_bTrackLeave)
{
// 鼠标第一次移入窗口时, 请求一个WM_MOUSELEAVE 消息

TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.hwndTrack = m_hWnd;
tme.dwFlags = TME_LEAVE | TME_HOVER;
tme.dwHoverTime = 1;
m_bTrackLeave = _TrackMouseEvent(&tme);
}

CDialog::OnMouseMove(nFlags, point);
}

LPARAM CShowDlg::OnMouseLeave(WPARAM wp, LPARAM lp)

{

m_bTrackLeave = FALSE;
ShowWindow(SW_HIDE);
return 0;
}

LPARAM CShowDlg::OnMouseHover(WPARAM wp, LPARAM lp)
{
m_bTrackLeave = TRUE;
ShowWindow(SW_NORMAL);
UpdateWindow();
return 0;
}
...全文
76 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
q2731787 2011-10-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 cnzdgs 的回复:]
可以换种思路:用SetTimer定时,检查鼠标光标的位置,然后决定显示或隐藏。
[/Quote]


palmax 2008-11-07
  • 打赏
  • 举报
回复
我大概知道楼主的想法了,可能楼主对TrackMouseEvent没有理解

第一次窗口在的时候,你调用TrackMouseEvent设置了要track hover 和 leave,然后你鼠标移开了,触发了WM_MOUSELEAVE,同时TrackMouseEvent的任务就完成了,而你隐藏窗口,窗口接受不到MOUSEMOVE,所以你也无法再次TrackMouseEvent。

楼主的代码有两点问题:
1. 参考cnzdgs在5楼说的,加定时器来判断鼠标位置,或者你在没有隐藏的父窗口判断鼠标位置,如果鼠标位于那个区域,就把子窗口显示
2. 每次MOUSELEAVE或MOUSEHOVER后,要把 m_bTrackLeave 置为 FALSE(不知你MouseHover里为什么置成了TRUE),以便下一次MouseMove时能再次调用TrackMouseEvent。
cnzdgs 2008-11-07
  • 打赏
  • 举报
回复
可以换种思路:用SetTimer定时,检查鼠标光标的位置,然后决定显示或隐藏。
xuxingok 2008-11-07
  • 打赏
  • 举报
回复
TME_HOVER是CTestDlg上的,发送到CShowDlg
cnzdgs 2008-11-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 palmax 的回复:]
窗口都隐藏了,还怎么收到 MouseMove或MouseHover的消息呢?
[/Quote]
同。你的想法是没法实现的。
hurricane511 2008-11-07
  • 打赏
  • 举报
回复
you want to show a window itself in its OnMouseHover function?
How can a window receive message related with mouse position when it's hidden?
I'm afraid you'd have to implement the function you need in CShowDlg's parent window.It'll be quite easy then.
palmax 2008-11-07
  • 打赏
  • 举报
回复
窗口都隐藏了,还怎么收到 MouseMove或MouseHover的消息呢?

15,979

社区成员

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

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