gpt4 book ai didi

c++ - 从 MFC CDialog 上的子控件接收 WM_MOUSEMOVE

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:33:24 27 4
gpt4 key购买 nike

我的对话框派生自 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 知道现在悬停的是什么控件。有什么解决办法吗?

最佳答案

如果这是模态对话框,我会尝试 CDialog::PreTranslateMessage()。如果您仍然无法检测到子项内的鼠标移动,剩下的唯一选择是 SetWindowsHookEx + WH_MOUSE

关于c++ - 从 MFC CDialog 上的子控件接收 WM_MOUSEMOVE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9115390/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com