[PATCH resend 5/7] comctl32: send WM_CTLCOLORSTATIC for all static control types

Rafał Harabień rafalh92 at outlook.com
Sat Mar 26 07:22:35 CDT 2022


Signed-off-by: Rafał Harabień <rafalh92 at outlook.com>
---
 dlls/comctl32/static.c       | 134 ++++++++++++++++-------------------
 dlls/comctl32/tests/static.c |  16 ++---
 2 files changed, 69 insertions(+), 81 deletions(-)

diff --git a/dlls/comctl32/static.c b/dlls/comctl32/static.c
index 1b5d1ade291..2fb914b3fb2 100644
--- a/dlls/comctl32/static.c
+++ b/dlls/comctl32/static.c
@@ -44,13 +44,13 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(static);
 
-static void STATIC_PaintOwnerDrawfn( HWND hwnd, HDC hdc, DWORD style );
-static void STATIC_PaintTextfn( HWND hwnd, HDC hdc, DWORD style );
-static void STATIC_PaintRectfn( HWND hwnd, HDC hdc, DWORD style );
-static void STATIC_PaintIconfn( HWND hwnd, HDC hdc, DWORD style );
-static void STATIC_PaintBitmapfn( HWND hwnd, HDC hdc, DWORD style );
-static void STATIC_PaintEnhMetafn( HWND hwnd, HDC hdc, DWORD style );
-static void STATIC_PaintEtchedfn( HWND hwnd, HDC hdc, DWORD style );
+static void STATIC_PaintOwnerDrawfn( HWND hwnd, HDC hdc, HBRUSH hbrush, DWORD style );
+static void STATIC_PaintTextfn( HWND hwnd, HDC hdc, HBRUSH hbrush, DWORD style );
+static void STATIC_PaintRectfn( HWND hwnd, HDC hdc, HBRUSH hbrush, DWORD style );
+static void STATIC_PaintIconfn( HWND hwnd, HDC hdc, HBRUSH hbrush, DWORD style );
+static void STATIC_PaintBitmapfn( HWND hwnd, HDC hdc, HBRUSH hbrush, DWORD style );
+static void STATIC_PaintEnhMetafn( HWND hwnd, HDC hdc, HBRUSH hbrush, DWORD style );
+static void STATIC_PaintEtchedfn( HWND hwnd, HDC hdc, HBRUSH hbrush, DWORD style );
 
 struct static_extra_info
 {
@@ -64,7 +64,7 @@ struct static_extra_info
     BOOL image_has_alpha;
 };
 
-typedef void (*pfPaint)( HWND hwnd, HDC hdc, DWORD style );
+typedef void (*pfPaint)( HWND hwnd, HDC hdc, HBRUSH hbrush, DWORD style );
 
 static const pfPaint staticPaintFunc[SS_TYPEMASK+1] =
 {
@@ -360,6 +360,22 @@ static HICON STATIC_LoadIconW( HINSTANCE hInstance, LPCWSTR name, DWORD style )
     return hicon;
 }
 
+static HBRUSH STATIC_SendWmCtlColorStatic(HWND hwnd, HDC hdc)
+{
+    HBRUSH hBrush;
+    HWND parent = GetParent(hwnd);
+
+    if (!parent) parent = hwnd;
+    hBrush = (HBRUSH) SendMessageW( parent, WM_CTLCOLORSTATIC, (WPARAM)hdc, (LPARAM)hwnd );
+    if (!hBrush) /* did the app forget to call DefWindowProc ? */
+    {
+        /* FIXME: DefWindowProc should return different colors if a
+                  manifest is present */
+        hBrush = (HBRUSH)DefWindowProcW( parent, WM_CTLCOLORSTATIC, (WPARAM)hdc, (LPARAM)hwnd);
+    }
+    return hBrush;
+}
+
 /***********************************************************************
  *           STATIC_TryPaintFcn
  *
@@ -367,40 +383,26 @@ static HICON STATIC_LoadIconW( HINSTANCE hInstance, LPCWSTR name, DWORD style )
  */
 static VOID STATIC_TryPaintFcn(HWND hwnd, LONG full_style)
 {
-    LONG style = full_style & SS_TYPEMASK;
-    RECT rc;
-
-    GetClientRect( hwnd, &rc );
-    if (!IsRectEmpty(&rc) && IsWindowVisible(hwnd) && staticPaintFunc[style])
+    if (IsWindowVisible(hwnd))
     {
+        RECT rc;
         HDC hdc;
         HRGN hrgn;
+        HBRUSH hbrush;
+        LONG style = full_style & SS_TYPEMASK;
 
+        GetClientRect( hwnd, &rc );
         hdc = GetDC( hwnd );
         hrgn = set_control_clipping( hdc, &rc );
-        (staticPaintFunc[style])( hwnd, hdc, full_style );
+        hbrush = STATIC_SendWmCtlColorStatic( hwnd, hdc );
+        if (staticPaintFunc[style])
+            (staticPaintFunc[style])( hwnd, hdc, hbrush, full_style );
         SelectClipRgn( hdc, hrgn );
         if (hrgn) DeleteObject( hrgn );
         ReleaseDC( hwnd, hdc );
     }
 }
 
-static HBRUSH STATIC_SendWmCtlColorStatic(HWND hwnd, HDC hdc)
-{
-    HBRUSH hBrush;
-    HWND parent = GetParent(hwnd);
-
-    if (!parent) parent = hwnd;
-    hBrush = (HBRUSH) SendMessageW( parent, WM_CTLCOLORSTATIC, (WPARAM)hdc, (LPARAM)hwnd );
-    if (!hBrush) /* did the app forget to call DefWindowProc ? */
-    {
-        /* FIXME: DefWindowProc should return different colors if a
-                  manifest is present */
-        hBrush = (HBRUSH)DefWindowProcW( parent, WM_CTLCOLORSTATIC, (WPARAM)hdc, (LPARAM)hwnd);
-    }
-    return hBrush;
-}
-
 /***********************************************************************
  *           hasTextStyle
  *
@@ -481,14 +483,16 @@ static LRESULT CALLBACK STATIC_WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam,
             PAINTSTRUCT ps;
             RECT rect;
             HDC hdc = wParam ? (HDC)wParam : BeginPaint(hwnd, &ps);
+            HRGN hrgn;
+            HBRUSH hbrush;
+
             GetClientRect( hwnd, &rect );
+            hrgn = set_control_clipping( hdc, &rect );
+            hbrush = STATIC_SendWmCtlColorStatic( hwnd, hdc );
             if (staticPaintFunc[style])
-            {
-                HRGN hrgn = set_control_clipping( hdc, &rect );
-                (staticPaintFunc[style])( hwnd, hdc, full_style );
-                SelectClipRgn( hdc, hrgn );
-                if (hrgn) DeleteObject( hrgn );
-            }
+                (staticPaintFunc[style])( hwnd, hdc, hbrush, full_style );
+            SelectClipRgn( hdc, hrgn );
+            if (hrgn) DeleteObject( hrgn );
             if (!wParam) EndPaint(hwnd, &ps);
         }
         break;
@@ -642,7 +646,7 @@ static LRESULT CALLBACK STATIC_WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam,
     return lResult;
 }
 
-static void STATIC_PaintOwnerDrawfn( HWND hwnd, HDC hdc, DWORD style )
+static void STATIC_PaintOwnerDrawfn( HWND hwnd, HDC hdc, HBRUSH hbrush, DWORD style )
 {
     DRAWITEMSTRUCT dis;
     HFONT font, oldFont = NULL;
@@ -660,15 +664,13 @@ static void STATIC_PaintOwnerDrawfn( HWND hwnd, HDC hdc, DWORD style )
 
     font = STATIC_GetFont( hwnd );
     if (font) oldFont = SelectObject( hdc, font );
-    SendMessageW( GetParent(hwnd), WM_CTLCOLORSTATIC, (WPARAM)hdc, (LPARAM)hwnd );
     SendMessageW( GetParent(hwnd), WM_DRAWITEM, id, (LPARAM)&dis );
     if (font) SelectObject( hdc, oldFont );
 }
 
-static void STATIC_PaintTextfn( HWND hwnd, HDC hdc, DWORD style )
+static void STATIC_PaintTextfn( HWND hwnd, HDC hdc, HBRUSH hbrush, DWORD style )
 {
     RECT rc;
-    HBRUSH hBrush;
     HFONT hFont, hOldFont = NULL;
     UINT format;
     INT len, buf_size;
@@ -725,13 +727,9 @@ static void STATIC_PaintTextfn( HWND hwnd, HDC hdc, DWORD style )
     if ((hFont = STATIC_GetFont( hwnd )))
         hOldFont = SelectObject( hdc, hFont );
 
-    /* SS_SIMPLE controls: WM_CTLCOLORSTATIC is sent, but the returned
-                           brush is not used */
-    hBrush = STATIC_SendWmCtlColorStatic(hwnd, hdc);
-
     if ((style & SS_TYPEMASK) != SS_SIMPLE)
     {
-        FillRect( hdc, &rc, hBrush );
+        FillRect( hdc, &rc, hbrush );
         if (!IsWindowEnabled(hwnd)) SetTextColor(hdc, GetSysColor(COLOR_GRAYTEXT));
     }
 
@@ -768,56 +766,52 @@ no_TextOut:
         SelectObject( hdc, hOldFont );
 }
 
-static void STATIC_PaintRectfn( HWND hwnd, HDC hdc, DWORD style )
+static void STATIC_PaintRectfn( HWND hwnd, HDC hdc, HBRUSH hbrush, DWORD style )
 {
     RECT rc;
-    HBRUSH hBrush;
 
     GetClientRect( hwnd, &rc);
 
-    /* FIXME: send WM_CTLCOLORSTATIC */
     switch (style & SS_TYPEMASK)
     {
     case SS_BLACKRECT:
-        hBrush = CreateSolidBrush(comctl32_color.clr3dDkShadow);
-        FillRect( hdc, &rc, hBrush );
+        hbrush = CreateSolidBrush(comctl32_color.clr3dDkShadow);
+        FillRect( hdc, &rc, hbrush );
         break;
     case SS_GRAYRECT:
-        hBrush = CreateSolidBrush(comctl32_color.clr3dShadow);
-        FillRect( hdc, &rc, hBrush );
+        hbrush = CreateSolidBrush(comctl32_color.clr3dShadow);
+        FillRect( hdc, &rc, hbrush );
         break;
     case SS_WHITERECT:
-        hBrush = CreateSolidBrush(comctl32_color.clr3dHilight);
-        FillRect( hdc, &rc, hBrush );
+        hbrush = CreateSolidBrush(comctl32_color.clr3dHilight);
+        FillRect( hdc, &rc, hbrush );
         break;
     case SS_BLACKFRAME:
-        hBrush = CreateSolidBrush(comctl32_color.clr3dDkShadow);
-        FrameRect( hdc, &rc, hBrush );
+        hbrush = CreateSolidBrush(comctl32_color.clr3dDkShadow);
+        FrameRect( hdc, &rc, hbrush );
         break;
     case SS_GRAYFRAME:
-        hBrush = CreateSolidBrush(comctl32_color.clr3dShadow);
-        FrameRect( hdc, &rc, hBrush );
+        hbrush = CreateSolidBrush(comctl32_color.clr3dShadow);
+        FrameRect( hdc, &rc, hbrush );
         break;
     case SS_WHITEFRAME:
-        hBrush = CreateSolidBrush(comctl32_color.clr3dHilight);
-        FrameRect( hdc, &rc, hBrush );
+        hbrush = CreateSolidBrush(comctl32_color.clr3dHilight);
+        FrameRect( hdc, &rc, hbrush );
         break;
     default:
         return;
     }
-    DeleteObject( hBrush );
+    DeleteObject( hbrush );
 }
 
 
-static void STATIC_PaintIconfn( HWND hwnd, HDC hdc, DWORD style )
+static void STATIC_PaintIconfn( HWND hwnd, HDC hdc, HBRUSH hbrush, DWORD style )
 {
     RECT rc, iconRect;
-    HBRUSH hbrush;
     HICON hIcon;
     SIZE size;
 
     GetClientRect( hwnd, &rc );
-    hbrush = STATIC_SendWmCtlColorStatic(hwnd, hdc);
     hIcon = STATIC_GetImage( hwnd, IMAGE_ICON, style );
     if (!hIcon || !get_icon_size( hIcon, &size ))
     {
@@ -840,13 +834,10 @@ static void STATIC_PaintIconfn( HWND hwnd, HDC hdc, DWORD style )
     }
 }
 
-static void STATIC_PaintBitmapfn(HWND hwnd, HDC hdc, DWORD style )
+static void STATIC_PaintBitmapfn(HWND hwnd, HDC hdc, HBRUSH hbrush, DWORD style )
 {
     HDC hMemDC;
     HBITMAP hBitmap, oldbitmap;
-    HBRUSH hbrush;
-
-    hbrush = STATIC_SendWmCtlColorStatic(hwnd, hdc);
 
     if ((hBitmap = STATIC_GetImage( hwnd, IMAGE_BITMAP, style ))
          && (GetObjectType(hBitmap) == OBJ_BITMAP)
@@ -891,14 +882,12 @@ static void STATIC_PaintBitmapfn(HWND hwnd, HDC hdc, DWORD style )
     }
 }
 
-static void STATIC_PaintEnhMetafn(HWND hwnd, HDC hdc, DWORD style )
+static void STATIC_PaintEnhMetafn(HWND hwnd, HDC hdc, HBRUSH hbrush, DWORD style )
 {
     HENHMETAFILE hEnhMetaFile;
     RECT rc;
-    HBRUSH hbrush;
 
     GetClientRect(hwnd, &rc);
-    hbrush = STATIC_SendWmCtlColorStatic(hwnd, hdc);
     FillRect(hdc, &rc, hbrush);
     if ((hEnhMetaFile = STATIC_GetImage( hwnd, IMAGE_ENHMETAFILE, style )))
     {
@@ -909,11 +898,10 @@ static void STATIC_PaintEnhMetafn(HWND hwnd, HDC hdc, DWORD style )
     }
 }
 
-static void STATIC_PaintEtchedfn( HWND hwnd, HDC hdc, DWORD style )
+static void STATIC_PaintEtchedfn( HWND hwnd, HDC hdc, HBRUSH hbrush, DWORD style )
 {
     RECT rc;
 
-    /* FIXME: sometimes (not always) sends WM_CTLCOLORSTATIC */
     GetClientRect( hwnd, &rc );
     DrawEdge(hdc, &rc, EDGE_ETCHED, BF_RECT);
 }
diff --git a/dlls/comctl32/tests/static.c b/dlls/comctl32/tests/static.c
index 7206e19c070..324301212dc 100644
--- a/dlls/comctl32/tests/static.c
+++ b/dlls/comctl32/tests/static.c
@@ -426,18 +426,18 @@ START_TEST(static)
 
     test_updates(0, 0);
     test_updates(SS_ICON, 0);
-    test_updates(SS_BLACKRECT, TODO_COUNT);
-    test_updates(SS_WHITERECT, TODO_COUNT);
-    test_updates(SS_BLACKFRAME, TODO_COUNT);
-    test_updates(SS_WHITEFRAME, TODO_COUNT);
-    test_updates(SS_USERITEM, TODO_COUNT);
+    test_updates(SS_BLACKRECT, 0);
+    test_updates(SS_WHITERECT, 0);
+    test_updates(SS_BLACKFRAME, 0);
+    test_updates(SS_WHITEFRAME, 0);
+    test_updates(SS_USERITEM, 0);
     test_updates(SS_SIMPLE, 0);
     test_updates(SS_OWNERDRAW, 0);
     test_updates(SS_BITMAP, 0);
     test_updates(SS_BITMAP | SS_CENTERIMAGE, 0);
-    test_updates(SS_ETCHEDHORZ, TODO_COUNT);
-    test_updates(SS_ETCHEDVERT, TODO_COUNT);
-    test_updates(SS_ETCHEDFRAME, TODO_COUNT);
+    test_updates(SS_ETCHEDHORZ, 0);
+    test_updates(SS_ETCHEDVERT, 0);
+    test_updates(SS_ETCHEDFRAME, 0);
     test_updates(SS_SUNKEN, 0);
     test_set_text();
     test_set_image();
-- 
2.25.1




More information about the wine-devel mailing list