gpt4 book ai didi

c++ - 当光标移到子窗口上时避免 WM_MOUSELEAVE

转载 作者:行者123 更新时间:2023-11-30 01:36:51 30 4
gpt4 key购买 nike

我正在使用 TrackMouseEventWM_MOUSEHOVERWM_MOUSELEAVE 处理鼠标悬停/离开事件。

唯一的问题是,当鼠标悬停在窗口的任何子窗口上时,它会向跟踪鼠标的窗口发送 WM_MOUSELEAVE 消息。

我其实明白 Windows 这样做的原因,但不知道如何修复它。谷歌搜索对我没有帮助。我相信解决方案非常简单,我只是错过了一些东西。我正在开发 Visual C++ Win32 应用程序。 (没有MFC等等)

我的代码:

void TrackMouse(HWND hwnd)
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(TRACKMOUSEEVENT);
tme.dwFlags = TME_HOVER | TME_LEAVE;
tme.dwHoverTime = 1; //How long the mouse has to be in the window to trigger a hover event.
tme.hwndTrack = hwnd;
TrackMouseEvent(&tme);
}

WndProc:

case WM_MOUSEMOVE:
{
if (!isTracking)
{
TrackMouse(hWnd);
isTracking = true;
}
break;
}

case WM_MOUSEHOVER:
ShowWindow(MouseIsOver, TRUE);
break;

case WM_MOUSELEAVE:
ShowWindow(MouseIsOver, FALSE);
isTracking = false;
break;

最佳答案

好的,所以,基于 OP(可能)想要实际上忽略 WM_MOUSELEAVE 当光标经过跟踪鼠标的窗口的子窗口时,我认为他是可能现在正在做这样的事情:

BOOL DidMouseLeaveWindow (HWND hWnd)
{
DWORD msgpos = GetMessagePos ();
POINT pt = { GET_X_LPARAM (msgpos), GET_Y_LPARAM (msgpos) };
ScreenToClient (hWnd, &pt);
RECT cr;
GetClientRect (hWnd, &cr);
return !PtInRect (&cr, pt);
}

这对我来说似乎很好。

如果你出于某种原因不喜欢它,你也可以这样做:

BOOL DidMouseLeaveWindow (HWND hWnd)
{
DWORD msgpos = GetMessagePos ();
POINT pt = { GET_X_LPARAM (msgpos), GET_Y_LPARAM (msgpos) };
HWND hWndUnderCursor = WindowFromPoint (pt);
return !IsChild (hWnd, hWndUnderCursor);
}

这可能更优雅一些。

不过,这两种方法都存在一些问题。如果(比方说)子窗口的右侧边缘与父窗口的右侧边缘完全对齐,并且您通过该边缘退出,那么父窗口将永远不会获得其 WM_MOUSELEAVE。如果您将光标放在子窗口上然后很快将其移出父窗口,您也可能会错过一个,

为了解决这些问题,我建议设置一个计时器作为后盾。所以,你会做这样的事情:

void TrackMouse(HWND hwnd)
{
// ...
SetTimer (hWnd, 1, 250, 0);
}

在 WndProc 中:

case WM_TIMER:
case WM_MOUSELEAVE:
if (DidMouseLeaveWindow (hWnd))
{
// ...
isTracking = false;
KillTimer (hWnd, 1);
}
break;

如果 TrackMouseEvent 有一个 TME_IGNORE_CHILDREN 标志就好了,但遗憾的是它没有。

关于c++ - 当光标移到子窗口上时避免 WM_MOUSELEAVE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51030926/

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