[COMCTL32] button: Don't erase the area of the checkbox or the text.
authorGiannis Adamopoulos <gadamopoulos@reactos.org>
Thu, 10 Jan 2019 21:35:56 +0000 (23:35 +0200)
committerGiannis Adamopoulos <gadamopoulos@reactos.org>
Thu, 10 Jan 2019 21:38:02 +0000 (23:38 +0200)
Attempt to fix the menace of the world, CORE-13278.
Note that this can also cause visual glitches for classic check boxes or radio buttons.

dll/win32/comctl32/button.c

index 5906747..602a37c 100644 (file)
@@ -1550,7 +1550,9 @@ static void CB_Paint( const BUTTON_INFO *infoPtr, HDC hDC, UINT action )
 
     /* Since WM_ERASEBKGND does nothing, first prepare background */
     if (action == ODA_SELECT) FillRect( hDC, &rbox, hBrush );
+#ifndef __REACTOS__
     if (action == ODA_DRAWENTIRE) FillRect( hDC, &client, hBrush );
+#endif
 
     /* Draw label */
     client = rtext;
@@ -1616,6 +1618,15 @@ static void CB_Paint( const BUTTON_INFO *infoPtr, HDC hDC, UINT action )
     if (action == ODA_DRAWENTIRE)
         BUTTON_DrawLabel(infoPtr, hDC, dtFlags, &rtext);
 
+#ifdef __REACTOS__
+    if (action == ODA_DRAWENTIRE)
+    {
+        ExcludeClipRect(hDC, rbox.left, rbox.top, rbox.right, rbox.bottom);
+        ExcludeClipRect(hDC, rtext.left, rtext.top + 1, rtext.right, rtext.bottom - 1);
+        FillRect( hDC, &client, hBrush );
+    }
+#endif
+
     /* ... and focus */
     if (action == ODA_FOCUS || (state & BST_FOCUS))
     {