Zhiyi Zhang : comctl32/button: Correctly place parts for themed push buttons.

Alexandre Julliard julliard at winehq.org
Fri Nov 5 17:15:52 CDT 2021


Module: wine
Branch: master
Commit: e1fb7f8b86af799c6074f880ddcf68cb5f2ca778
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=e1fb7f8b86af799c6074f880ddcf68cb5f2ca778

Author: Zhiyi Zhang <zzhang at codeweavers.com>
Date:   Fri Nov  5 14:34:37 2021 +0800

comctl32/button: Correctly place parts for themed push buttons.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51916
Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/comctl32/button.c | 47 ++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 40 insertions(+), 7 deletions(-)

diff --git a/dlls/comctl32/button.c b/dlls/comctl32/button.c
index 70ac6b1c2da..80635feaafc 100644
--- a/dlls/comctl32/button.c
+++ b/dlls/comctl32/button.c
@@ -1761,6 +1761,38 @@ static void BUTTON_DrawLabel(const BUTTON_INFO *infoPtr, HDC hdc, UINT dtFlags,
    heap_free(text);
 }
 
+static void BUTTON_DrawThemedLabel(const BUTTON_INFO *info, HDC hdc, UINT text_flags,
+                                   const RECT *image_rect, const RECT *text_rect, HTHEME theme,
+                                   int part, int state)
+{
+    HBRUSH brush = NULL;
+    UINT image_flags;
+    WCHAR *text;
+
+    if (show_image(info))
+    {
+        image_flags = IsWindowEnabled(info->hwnd) ? DSS_NORMAL : DSS_DISABLED;
+
+        if ((GetWindowLongW(info->hwnd, GWL_STYLE) & BS_PUSHLIKE)
+            && (info->state & BST_INDETERMINATE))
+        {
+            brush = GetSysColorBrush(COLOR_GRAYTEXT);
+            image_flags |= DSS_MONO;
+        }
+
+        BUTTON_DrawImage(info, hdc, brush, image_flags, image_rect);
+    }
+
+   if (show_image_only(info))
+       return;
+
+   if (!(text = get_button_text(info)))
+       return;
+
+   DrawThemeText(theme, hdc, part, state, text, lstrlenW(text), text_flags, 0, text_rect);
+   heap_free(text);
+}
+
 /**********************************************************************
  *       Push Button Functions
  */
@@ -2661,17 +2693,16 @@ cleanup:
  */
 static void PB_ThemedPaint(HTHEME theme, const BUTTON_INFO *infoPtr, HDC hDC, int state, UINT dtFlags, BOOL focused)
 {
-    RECT bgRect, textRect, focusRect;
+    RECT bgRect, labelRect, imageRect, textRect, focusRect;
     NMCUSTOMDRAW nmcd;
     LRESULT cdrf;
     HWND parent;
-    WCHAR *text;
 
     if (infoPtr->font) SelectObject(hDC, infoPtr->font);
 
     GetClientRect(infoPtr->hwnd, &bgRect);
-    GetThemeBackgroundContentRect(theme, hDC, BP_PUSHBUTTON, state, &bgRect, &textRect);
-    focusRect = textRect;
+    GetThemeBackgroundContentRect(theme, hDC, BP_PUSHBUTTON, state, &bgRect, &labelRect);
+    focusRect = labelRect;
 
     init_custom_draw(&nmcd, infoPtr, hDC, &bgRect);
 
@@ -2697,10 +2728,12 @@ static void PB_ThemedPaint(HTHEME theme, const BUTTON_INFO *infoPtr, HDC hDC, in
     cdrf = SendMessageW(parent, WM_NOTIFY, nmcd.hdr.idFrom, (LPARAM)&nmcd);
     if (cdrf & CDRF_SKIPDEFAULT) return;
 
-    if (!(cdrf & CDRF_DOERASE) && (text = get_button_text(infoPtr)))
+    if (!(cdrf & CDRF_DOERASE))
     {
-        DrawThemeText(theme, hDC, BP_PUSHBUTTON, state, text, lstrlenW(text), dtFlags, 0, &textRect);
-        heap_free(text);
+        dtFlags = BUTTON_CalcLayoutRects(infoPtr, hDC, &labelRect, &imageRect, &textRect);
+        if (dtFlags != (UINT)-1L)
+            BUTTON_DrawThemedLabel(infoPtr, hDC, dtFlags, &imageRect, &textRect, theme,
+                                   BP_PUSHBUTTON, state);
     }
 
     if (cdrf & CDRF_NOTIFYPOSTPAINT)




More information about the wine-cvs mailing list