Zhiyi Zhang : comctl32/combo: Subscribe to WM_MOUSELEAVE events.
Alexandre Julliard
julliard at winehq.org
Wed Mar 3 15:47:30 CST 2021
Module: wine
Branch: master
Commit: 161649e318457773cc879a37f4cc8b298ffea08c
URL: https://source.winehq.org/git/wine.git/?a=commit;h=161649e318457773cc879a37f4cc8b298ffea08c
Author: Zhiyi Zhang <zzhang at codeweavers.com>
Date: Wed Mar 3 14:48:53 2021 +0800
comctl32/combo: Subscribe to WM_MOUSELEAVE events.
Using WM_MOUSEMOVE events to determine whether the dropdown button is
hovered is unreliable and thus the dropdown button may stay in hovered
state even if mouse has left the window.
Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/comctl32/combo.c | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/dlls/comctl32/combo.c b/dlls/comctl32/combo.c
index 572740b5cfd..887587a053b 100644
--- a/dlls/comctl32/combo.c
+++ b/dlls/comctl32/combo.c
@@ -1632,6 +1632,13 @@ static void COMBO_MouseMove( LPHEADCOMBO lphc, WPARAM wParam, LPARAM lParam )
}
}
+static LRESULT COMBO_MouseLeave(LPHEADCOMBO lphc)
+{
+ lphc->wState &= ~CBF_HOT;
+ RedrawWindow(lphc->self, &lphc->buttonRect, 0, RDW_INVALIDATE | RDW_UPDATENOW);
+ return 0;
+}
+
static LRESULT COMBO_GetComboBoxInfo(const HEADCOMBO *lphc, COMBOBOXINFO *pcbi)
{
if (!pcbi || (pcbi->cbSize < sizeof(COMBOBOXINFO)))
@@ -1871,6 +1878,7 @@ static LRESULT CALLBACK COMBO_WindowProc( HWND hwnd, UINT message, WPARAM wParam
case WM_MOUSEMOVE:
if (!IsRectEmpty(&lphc->buttonRect))
{
+ TRACKMOUSEEVENT event;
POINT pt;
pt.x = (short)LOWORD(lParam);
@@ -1882,6 +1890,15 @@ static LRESULT CALLBACK COMBO_WindowProc( HWND hwnd, UINT message, WPARAM wParam
{
lphc->wState |= CBF_HOT;
RedrawWindow(hwnd, &lphc->buttonRect, 0, RDW_INVALIDATE | RDW_UPDATENOW);
+
+ event.cbSize = sizeof(TRACKMOUSEEVENT);
+ event.dwFlags = TME_QUERY;
+ if (!TrackMouseEvent(&event) || event.hwndTrack != hwnd || !(event.dwFlags & TME_LEAVE))
+ {
+ event.hwndTrack = hwnd;
+ event.dwFlags = TME_LEAVE;
+ TrackMouseEvent(&event);
+ }
}
}
else if (lphc->wState & CBF_HOT)
@@ -1895,6 +1912,9 @@ static LRESULT CALLBACK COMBO_WindowProc( HWND hwnd, UINT message, WPARAM wParam
COMBO_MouseMove( lphc, wParam, lParam );
return TRUE;
+ case WM_MOUSELEAVE:
+ return COMBO_MouseLeave(lphc);
+
case WM_MOUSEWHEEL:
if (wParam & (MK_SHIFT | MK_CONTROL))
return DefWindowProcW(hwnd, message, wParam, lParam);
More information about the wine-cvs
mailing list