Zhiyi Zhang : comctl32/button: Correctly place parts for themed group boxes.
Alexandre Julliard
julliard at winehq.org
Fri Nov 5 17:15:52 CDT 2021
Module: wine
Branch: master
Commit: 7c9cacd47f969181624b2c5fafd7554188d7fa47
URL: https://source.winehq.org/git/wine.git/?a=commit;h=7c9cacd47f969181624b2c5fafd7554188d7fa47
Author: Zhiyi Zhang <zzhang at codeweavers.com>
Date: Fri Nov 5 14:34:58 2021 +0800
comctl32/button: Correctly place parts for themed group boxes.
Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/comctl32/button.c | 49 +++++++++++++++++++++++++++----------------------
1 file changed, 27 insertions(+), 22 deletions(-)
diff --git a/dlls/comctl32/button.c b/dlls/comctl32/button.c
index 515dff03921..7b617a199b0 100644
--- a/dlls/comctl32/button.c
+++ b/dlls/comctl32/button.c
@@ -2855,11 +2855,12 @@ cleanup:
static void GB_ThemedPaint(HTHEME theme, const BUTTON_INFO *infoPtr, HDC hDC, int state, UINT dtFlags, BOOL focused)
{
- RECT bgRect, textRect, contentRect;
- WCHAR *text = get_button_text(infoPtr);
+ RECT clientRect, contentRect, imageRect, textRect, bgRect;
+ HRGN region, textRegion = NULL;
LOGFONTW lf;
HFONT font, hPrevFont = NULL;
BOOL created_font = FALSE;
+ TEXTMETRICW textMetric;
HRESULT hr = GetThemeFont(theme, hDC, BP_GROUPBOX, state, TMT_FONT, &lf);
if (SUCCEEDED(hr)) {
@@ -2875,37 +2876,41 @@ static void GB_ThemedPaint(HTHEME theme, const BUTTON_INFO *infoPtr, HDC hDC, in
SelectObject(hDC, infoPtr->font);
}
- GetClientRect(infoPtr->hwnd, &bgRect);
- textRect = bgRect;
+ GetClientRect(infoPtr->hwnd, &clientRect);
+ GetThemeBackgroundContentRect(theme, hDC, BP_GROUPBOX, state, &clientRect, &contentRect);
+ region = set_control_clipping(hDC, &clientRect);
- if (text)
- {
- SIZE textExtent;
- GetTextExtentPoint32W(hDC, text, lstrlenW(text), &textExtent);
- bgRect.top += (textExtent.cy / 2);
- textRect.left += 10;
- textRect.bottom = textRect.top + textExtent.cy;
- textRect.right = textRect.left + textExtent.cx + 4;
+ bgRect = contentRect;
+ GetTextMetricsW(hDC, &textMetric);
+ bgRect.top += (textMetric.tmHeight / 2) - 1;
- ExcludeClipRect(hDC, textRect.left, textRect.top, textRect.right, textRect.bottom);
+ InflateRect(&contentRect, -7, 1);
+ dtFlags = BUTTON_CalcLayoutRects(infoPtr, hDC, &contentRect, &imageRect, &textRect);
+ if (dtFlags != (UINT)-1 && !show_image_only(infoPtr))
+ {
+ textRegion = CreateRectRgnIndirect(&textRect);
+ ExtSelectClipRgn(hDC, textRegion, RGN_DIFF);
}
- GetThemeBackgroundContentRect(theme, hDC, BP_GROUPBOX, state, &bgRect, &contentRect);
- ExcludeClipRect(hDC, contentRect.left, contentRect.top, contentRect.right, contentRect.bottom);
-
if (IsThemeBackgroundPartiallyTransparent(theme, BP_GROUPBOX, state))
DrawThemeParentBackground(infoPtr->hwnd, hDC, NULL);
DrawThemeBackground(theme, hDC, BP_GROUPBOX, state, &bgRect, NULL);
- SelectClipRgn(hDC, NULL);
-
- if (text)
+ if (dtFlags != (UINT)-1)
{
- InflateRect(&textRect, -2, 0);
- DrawThemeText(theme, hDC, BP_GROUPBOX, state, text, lstrlenW(text), 0, 0, &textRect);
- heap_free(text);
+ contentRect.left--;
+ contentRect.right++;
+ contentRect.bottom++;
+ if (textRegion)
+ {
+ SelectClipRgn(hDC, textRegion);
+ DeleteObject(textRegion);
+ }
+ BUTTON_DrawThemedLabel(infoPtr, hDC, dtFlags, &imageRect, &textRect, theme, BP_GROUPBOX, state);
}
+ SelectClipRgn(hDC, region);
+ if (region) DeleteObject(region);
if (created_font) DeleteObject(font);
if (hPrevFont) SelectObject(hDC, hPrevFont);
}
More information about the wine-cvs
mailing list