【发布时间】:2012-02-02 15:53:37
【问题描述】:
我的对话框是从 CDialog 派生的,一旦用户将鼠标光标移开,我想关闭它。为此,我添加了调用 OnCancel() 的 OnMouseLeave 处理程序。据我了解,要及时发送 WM_MOUSELEAVE 事件,必须在 OnMouseMove 例程中调用 TrackMouseEvent。所以整个代码如下:
void CDlgMain::OnMouseLeave()
{
CDialog::OnMouseLeave();
// Close dialog when cursor is going out of it
OnCancel();
}
void CDlgMain::OnMouseMove(UINT nFlags, CPoint point)
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.hwndTrack = m_hWnd;
tme.dwFlags = TME_LEAVE;
tme.dwHoverTime = HOVER_DEFAULT;
TrackMouseEvent(&tme);
CDialog::OnMouseMove(nFlags, point);
}
它工作正常,但是当用户悬停它的一些子控件时对话框关闭(比如他想点击的按钮:))。这是因为子控件不会向父对话框发送 WM_MOUSEMOVE。
我发现从子控件“传播”WM_MOUSEMOVE 消息的唯一函数是 SetCapture()。它可以完成这项工作,但是 1)用户在此之后无法单击任何按钮,并且 2)鼠标图标变为沙漏。所以这不是一个选择。
有什么建议吗?
更新我将 TrackMouseEvent 调用置于 PreTranslateMessage 例程中,该例程在任何鼠标移动事件(甚至悬停子控件)上都会正确调用。奇怪的是,当用户悬停子控件时,仍然会生成 WM_MOUSELEAVE!好像 TrackMouseEvent 知道现在悬停的是什么控件。任何想法如何解决这个问题?
【问题讨论】:
标签: c++ visual-studio-2010 mfc mouseevent