From 2d75a2425e401e5b7781f3484298ae8ebca01bb9 Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Thu, 17 May 2012 12:22:32 +0200 Subject: [PATCH] comctl32: Return if point is over a button in TOOLBAR_InternalHitTest. --- dlls/comctl32/toolbar.c | 50 ++++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/dlls/comctl32/toolbar.c b/dlls/comctl32/toolbar.c index fbabc1d7351..9807745270b 100644 --- a/dlls/comctl32/toolbar.c +++ b/dlls/comctl32/toolbar.c @@ -1775,11 +1775,14 @@ TOOLBAR_LayoutToolbar(TOOLBAR_INFO *infoPtr) static INT -TOOLBAR_InternalHitTest (const TOOLBAR_INFO *infoPtr, const POINT *lpPt) +TOOLBAR_InternalHitTest (const TOOLBAR_INFO *infoPtr, const POINT *lpPt, BOOL *button) { TBUTTON_INFO *btnPtr; INT i; + if (button) + *button = FALSE; + btnPtr = infoPtr->buttons; for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++) { if (btnPtr->fsState & TBSTATE_HIDDEN) @@ -1794,6 +1797,8 @@ TOOLBAR_InternalHitTest (const TOOLBAR_INFO *infoPtr, const POINT *lpPt) else { if (PtInRect (&btnPtr->rect, *lpPt)) { TRACE(" ON BUTTON %d!\n", i); + if (button) + *button = TRUE; return i; } } @@ -3664,7 +3669,7 @@ TOOLBAR_HideButton (TOOLBAR_INFO *infoPtr, INT Id, BOOL fHide) static inline LRESULT TOOLBAR_HitTest (const TOOLBAR_INFO *infoPtr, const POINT* lpPt) { - return TOOLBAR_InternalHitTest (infoPtr, lpPt); + return TOOLBAR_InternalHitTest (infoPtr, lpPt, NULL); } @@ -5376,13 +5381,13 @@ static LRESULT TOOLBAR_LButtonDblClk (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam) { POINT pt; - INT nHit; + BOOL button; pt.x = (short)LOWORD(lParam); pt.y = (short)HIWORD(lParam); - nHit = TOOLBAR_InternalHitTest (infoPtr, &pt); + TOOLBAR_InternalHitTest (infoPtr, &pt, &button); - if (nHit >= 0) + if (button) TOOLBAR_LButtonDown (infoPtr, wParam, lParam); else if (infoPtr->dwStyle & CCS_ADJUSTABLE) TOOLBAR_Customize (infoPtr); @@ -5400,6 +5405,7 @@ TOOLBAR_LButtonDown (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam) NMTOOLBARA nmtb; NMMOUSE nmmouse; BOOL bDragKeyPressed; + BOOL button; TRACE("\n"); @@ -5414,11 +5420,12 @@ TOOLBAR_LButtonDown (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam) pt.x = (short)LOWORD(lParam); pt.y = (short)HIWORD(lParam); - nHit = TOOLBAR_InternalHitTest (infoPtr, &pt); + nHit = TOOLBAR_InternalHitTest (infoPtr, &pt, &button); - btnPtr = &infoPtr->buttons[nHit]; + if (button) + btnPtr = &infoPtr->buttons[nHit]; - if ((nHit >= 0) && bDragKeyPressed && (infoPtr->dwStyle & CCS_ADJUSTABLE)) + if (button && bDragKeyPressed && (infoPtr->dwStyle & CCS_ADJUSTABLE)) { infoPtr->nButtonDrag = nHit; SetCapture (infoPtr->hwndSelf); @@ -5429,7 +5436,7 @@ TOOLBAR_LButtonDown (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam) hCursorDrag = LoadCursorW(COMCTL32_hModule, (LPCWSTR)IDC_MOVEBUTTON); SetCursor(hCursorDrag); } - else if (nHit >= 0) + else if (button) { RECT arrowRect; infoPtr->nOldHit = nHit; @@ -5476,8 +5483,8 @@ TOOLBAR_LButtonDown (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam) * NOTE: native doesn't do this, but that is a bug */ GetCursorPos(&pt); ScreenToClient(infoPtr->hwndSelf, &pt); - nHit = TOOLBAR_InternalHitTest(infoPtr, &pt); - if (!infoPtr->bAnchor || (nHit >= 0)) + nHit = TOOLBAR_InternalHitTest(infoPtr, &pt, &button); + if (!infoPtr->bAnchor || button) TOOLBAR_SetHotItemEx(infoPtr, nHit, HICF_MOUSE | HICF_LMOUSE); /* remove any left mouse button down or double-click messages @@ -5504,7 +5511,7 @@ TOOLBAR_LButtonDown (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam) SetCapture (infoPtr->hwndSelf); } - if (nHit >=0) + if (button) { memset(&nmtb, 0, sizeof(nmtb)); nmtb.iItem = btnPtr->idCommand; @@ -5514,7 +5521,7 @@ TOOLBAR_LButtonDown (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam) nmmouse.dwHitInfo = nHit; /* !!! Undocumented - sends NM_LDOWN with the NMMOUSE structure. */ - if (nHit < 0) + if (!button) nmmouse.dwItemSpec = -1; else { @@ -5541,6 +5548,7 @@ TOOLBAR_LButtonUp (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam) NMHDR hdr; NMMOUSE nmmouse; NMTOOLBARA nmtb; + BOOL button; if (infoPtr->hwndToolTip) TOOLBAR_RelayEvent (infoPtr->hwndToolTip, infoPtr->hwndSelf, @@ -5548,9 +5556,9 @@ TOOLBAR_LButtonUp (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam) pt.x = (short)LOWORD(lParam); pt.y = (short)HIWORD(lParam); - nHit = TOOLBAR_InternalHitTest (infoPtr, &pt); + nHit = TOOLBAR_InternalHitTest (infoPtr, &pt, &button); - if (!infoPtr->bAnchor || (nHit >= 0)) + if (!infoPtr->bAnchor || button) TOOLBAR_SetHotItemEx(infoPtr, nHit, HICF_MOUSE | HICF_LMOUSE); if (infoPtr->nButtonDrag >= 0) { @@ -5676,7 +5684,7 @@ TOOLBAR_LButtonUp (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam) * NM_CLICK with the NMMOUSE structure. */ nmmouse.dwHitInfo = nHit; - if (nHit < 0) + if (!button) nmmouse.dwItemSpec = -1; else { @@ -5699,14 +5707,15 @@ TOOLBAR_RButtonUp(TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam) INT nHit; NMMOUSE nmmouse; POINT pt; + BOOL button; pt.x = (short)LOWORD(lParam); pt.y = (short)HIWORD(lParam); - nHit = TOOLBAR_InternalHitTest(infoPtr, &pt); + nHit = TOOLBAR_InternalHitTest(infoPtr, &pt, &button); nmmouse.dwHitInfo = nHit; - if (nHit < 0) { + if (!button) { nmmouse.dwItemSpec = -1; } else { nmmouse.dwItemSpec = infoPtr->buttons[nmmouse.dwHitInfo].idCommand; @@ -5805,6 +5814,7 @@ TOOLBAR_MouseMove (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam) TRACKMOUSEEVENT trackinfo; INT nHit; TBUTTON_INFO *btnPtr; + BOOL button; if ((infoPtr->dwStyle & TBSTYLE_TOOLTIPS) && (infoPtr->hwndToolTip == NULL)) TOOLBAR_TooltipCreateControl(infoPtr); @@ -5835,10 +5845,10 @@ TOOLBAR_MouseMove (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam) pt.x = (short)LOWORD(lParam); pt.y = (short)HIWORD(lParam); - nHit = TOOLBAR_InternalHitTest (infoPtr, &pt); + nHit = TOOLBAR_InternalHitTest (infoPtr, &pt, &button); if (((infoPtr->dwStyle & TBSTYLE_FLAT) || GetWindowTheme (infoPtr->hwndSelf)) - && (!infoPtr->bAnchor || (nHit >= 0))) + && (!infoPtr->bAnchor || button)) TOOLBAR_SetHotItemEx(infoPtr, nHit, HICF_MOUSE); if (infoPtr->nOldHit != nHit)