https://git.reactos.org/?p=reactos.git;a=commitdiff;h=1bfbdb612305efa463d3fc5846e0c3b40dcc3a02

commit 1bfbdb612305efa463d3fc5846e0c3b40dcc3a02
Author: Giannis Adamopoulos <[email protected]>
AuthorDate: Mon Nov 20 18:51:03 2017 +0200

    [COMCTL32] Button: Use double buffering when themes are enabled.
---
 dll/win32/comctl32/theme_button.c | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/dll/win32/comctl32/theme_button.c 
b/dll/win32/comctl32/theme_button.c
index 755f4a7f06..4e72b0aa29 100644
--- a/dll/win32/comctl32/theme_button.c
+++ b/dll/win32/comctl32/theme_button.c
@@ -456,6 +456,36 @@ BOOL BUTTON_PaintWithTheme(HTHEME theme, HWND hwnd, HDC 
hParamDC, LPARAM prfFlag
     else
         drawState = STATE_NORMAL;
 
+    if (paint == PB_draw || paint == CB_draw)
+    {
+        HDC hdc;
+        HBITMAP hbmp;
+        RECT rc;
+
+        GetClientRect(hwnd, &rc);
+        hdc = CreateCompatibleDC(hParamDC);
+        hbmp = CreateCompatibleBitmap(hParamDC, rc.right, rc.bottom);
+        if (hdc && hbmp)
+        {
+            SelectObject(hdc, hbmp);
+
+            paint(theme, hwnd, hdc, drawState, dtFlags, state & BST_FOCUS, 
prfFlag);
+
+            BitBlt(hParamDC, 0, 0, rc.right, rc.bottom, hdc, 0, 0, SRCCOPY);
+            DeleteObject(hbmp);
+            DeleteDC(hdc);
+            return TRUE;
+        }
+        else
+        {
+            ERR("Failed to create DC and bitmap for double buffering\n");
+            if (hbmp)
+                DeleteObject(hbmp);
+            if (hdc)
+                DeleteDC(hdc);
+        }
+    }
+
     paint(theme, hwnd, hParamDC, drawState, dtFlags, state & BST_FOCUS, 
prfFlag);
     return TRUE;
 }

Reply via email to