Mark Harmstone : winecfg: Draw colour button using theme.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Feb 20 08:24:45 CST 2015


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

Author: Mark Harmstone <hellas at burntcomma.com>
Date:   Fri Feb 20 00:03:58 2015 +0000

winecfg: Draw colour button using theme.

---

 programs/winecfg/theme.c | 58 +++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 48 insertions(+), 10 deletions(-)

diff --git a/programs/winecfg/theme.c b/programs/winecfg/theme.c
index 0618974..79c8b7c 100644
--- a/programs/winecfg/theme.c
+++ b/programs/winecfg/theme.c
@@ -1070,14 +1070,52 @@ static void on_draw_item(HWND hDlg, WPARAM wParam, LPARAM lParam)
 
     if (draw_info->CtlID == IDC_SYSPARAM_COLOR)
     {
-        UINT state = DFCS_ADJUSTRECT | DFCS_BUTTONPUSH;
+        UINT state;
+        HTHEME theme;
+        RECT buttonrect;
 
-        if (draw_info->itemState & ODS_DISABLED)
-            state |= DFCS_INACTIVE;
-        else
-            state |= draw_info->itemState & ODS_SELECTED ? DFCS_PUSHED : 0;
+        theme = OpenThemeData(draw_info->hwndItem, WC_BUTTONW);
 
-        DrawFrameControl(draw_info->hDC, &draw_info->rcItem, DFC_BUTTON, state);
+        if (theme) {
+            MARGINS margins;
+
+            if (draw_info->itemState & ODS_DISABLED)
+                state = PBS_DISABLED;
+            else if (draw_info->itemState & ODS_SELECTED)
+                state = PBS_PRESSED;
+            else
+                state = PBS_NORMAL;
+
+            if (IsThemeBackgroundPartiallyTransparent(theme, BP_PUSHBUTTON, state))
+                DrawThemeParentBackground(draw_info->hwndItem, draw_info->hDC, NULL);
+
+            DrawThemeBackground(theme, draw_info->hDC, BP_PUSHBUTTON, state, &draw_info->rcItem, NULL);
+
+            buttonrect = draw_info->rcItem;
+
+            GetThemeMargins(theme, draw_info->hDC, BP_PUSHBUTTON, state, TMT_CONTENTMARGINS, &draw_info->rcItem, &margins);
+
+            buttonrect.left += margins.cxLeftWidth;
+            buttonrect.top += margins.cyTopHeight;
+            buttonrect.right -= margins.cxRightWidth;
+            buttonrect.bottom -= margins.cyBottomHeight;
+
+            if (draw_info->itemState & ODS_FOCUS)
+                DrawFocusRect(draw_info->hDC, &buttonrect);
+
+            CloseThemeData(theme);
+        } else {
+            state = DFCS_ADJUSTRECT | DFCS_BUTTONPUSH;
+
+            if (draw_info->itemState & ODS_DISABLED)
+                state |= DFCS_INACTIVE;
+            else
+                state |= draw_info->itemState & ODS_SELECTED ? DFCS_PUSHED : 0;
+
+            DrawFrameControl(draw_info->hDC, &draw_info->rcItem, DFC_BUTTON, state);
+
+            buttonrect = draw_info->rcItem;
+        }
 
         if (!(draw_info->itemState & ODS_DISABLED))
         {
@@ -1087,10 +1125,10 @@ static void on_draw_item(HWND hDlg, WPARAM wParam, LPARAM lParam)
             index = SendDlgItemMessageW(hDlg, IDC_SYSPARAM_COMBO, CB_GETITEMDATA, index, 0);
             brush = CreateSolidBrush(metrics[index].color);
 
-            InflateRect(&draw_info->rcItem, -1, -1);
-            FrameRect(draw_info->hDC, &draw_info->rcItem, black_brush);
-            InflateRect(&draw_info->rcItem, -1, -1);
-            FillRect(draw_info->hDC, &draw_info->rcItem, brush);
+            InflateRect(&buttonrect, -1, -1);
+            FrameRect(draw_info->hDC, &buttonrect, black_brush);
+            InflateRect(&buttonrect, -1, -1);
+            FillRect(draw_info->hDC, &buttonrect, brush);
             DeleteObject(brush);
         }
     }




More information about the wine-cvs mailing list