[PATCH 2/3] comctl32/button: Avoid drawing over content in themed group boxes.

Zhiyi Zhang zzhang at codeweavers.com
Thu Dec 9 02:13:06 CST 2021


Fix a regression from 7c9cacd, in which a ExcludeClipRect() call was removed by mistake.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52080
Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
 dlls/comctl32/button.c | 23 +++++++++++++++++------
 1 file changed, 17 insertions(+), 6 deletions(-)

diff --git a/dlls/comctl32/button.c b/dlls/comctl32/button.c
index 9e0ed8a8987..063149e91a4 100644
--- a/dlls/comctl32/button.c
+++ b/dlls/comctl32/button.c
@@ -2877,12 +2877,13 @@ cleanup:
 
 static void GB_ThemedPaint(HTHEME theme, const BUTTON_INFO *infoPtr, HDC hDC, int state, UINT dtFlags, BOOL focused)
 {
-    RECT clientRect, contentRect, imageRect, textRect, bgRect;
+    RECT clientRect, contentRect, labelRect, imageRect, textRect, bgRect;
     HRGN region, textRegion = NULL;
     LOGFONTW lf;
     HFONT font, hPrevFont = NULL;
     BOOL created_font = FALSE;
     TEXTMETRICW textMetric;
+    LONG style;
     int part;
 
     HRESULT hr = GetThemeFont(theme, hDC, BP_GROUPBOX, state, TMT_FONT, &lf);
@@ -2900,22 +2901,32 @@ static void GB_ThemedPaint(HTHEME theme, const BUTTON_INFO *infoPtr, HDC hDC, in
     }
 
     GetClientRect(infoPtr->hwnd, &clientRect);
-    contentRect = clientRect;
     region = set_control_clipping(hDC, &clientRect);
 
-    bgRect = contentRect;
+    bgRect = clientRect;
     GetTextMetricsW(hDC, &textMetric);
     bgRect.top += (textMetric.tmHeight / 2) - 1;
 
-    InflateRect(&contentRect, -7, 1);
-    dtFlags = BUTTON_CalcLayoutRects(infoPtr, hDC, &contentRect, &imageRect, &textRect);
+    labelRect = clientRect;
+    InflateRect(&labelRect, -7, 1);
+    dtFlags = BUTTON_CalcLayoutRects(infoPtr, hDC, &labelRect, &imageRect, &textRect);
     if (dtFlags != (UINT)-1 && !show_image_only(infoPtr))
     {
         textRegion = CreateRectRgnIndirect(&textRect);
         ExtSelectClipRgn(hDC, textRegion, RGN_DIFF);
     }
 
-    part = GetWindowLongW(infoPtr->hwnd, GWL_STYLE) & BS_PUSHLIKE ? BP_PUSHBUTTON : BP_GROUPBOX;
+    style = GetWindowLongW(infoPtr->hwnd, GWL_STYLE);
+    if (style & BS_PUSHLIKE)
+    {
+        part = BP_PUSHBUTTON;
+    }
+    else
+    {
+        part = BP_GROUPBOX;
+        GetThemeBackgroundContentRect(theme, hDC, part, state, &bgRect, &contentRect);
+        ExcludeClipRect(hDC, contentRect.left, contentRect.top, contentRect.right, contentRect.bottom);
+    }
     if (IsThemeBackgroundPartiallyTransparent(theme, part, state))
         DrawThemeParentBackground(infoPtr->hwnd, hDC, NULL);
     DrawThemeBackground(theme, hDC, part, state, &bgRect, NULL);
-- 
2.32.0




More information about the wine-devel mailing list