From c72b9f65ecf8cb637381633c347a3768f10dcc01 Mon Sep 17 00:00:00 2001 From: Jonas Kümmerlin Date: Fri, 1 May 2020 20:14:26 +0200 Subject: groupbox: uxtheme support disabled state looks different to original (where it looks the same as the enabled state), but I like it better that way. --- alf/alfgroupbox.cpp | 95 +++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 85 insertions(+), 10 deletions(-) (limited to 'alf') diff --git a/alf/alfgroupbox.cpp b/alf/alfgroupbox.cpp index a2dfb9b..fe49993 100644 --- a/alf/alfgroupbox.cpp +++ b/alf/alfgroupbox.cpp @@ -1,5 +1,10 @@ #include "alfpriv.h" +#define BP_GROUPBOX 4 +#define GBS_NORMAL 1 +#define GBS_DISABLED 2 +#define TMT_TEXTCOLOR 3803 + TCHAR *_alf_groupboxClass = NULL; typedef struct { @@ -17,6 +22,8 @@ static void ALF_GroupBox_EndCalcSizes(ALFLayout *layout, HWND hwnd, SIZE *contai static void ALF_GroupBox_PreContainerWidgetApplyPos(ALFLayout *layout, HWND groupbox, HWND child, RECT *r); +static void ALF_GroupBox_HandleThemeChange(ALFGroupBoxPriv *priv, HWND hwnd); + static void ALF_GroupBox_IntializePriv(ALFGroupBoxPriv *priv, HWND window, const TCHAR *text) { @@ -28,18 +35,63 @@ ALF_GroupBox_IntializePriv(ALFGroupBoxPriv *priv, HWND window, const TCHAR *text priv->label = ALF_AddLabel(window, (WORD)-1, -1, -1, text); ALF_LabelSetStyle(priv->label, ALF_LABEL_ALIGN_LEFT | ALF_LABEL_ALIGN_TOP); + + ALF_GroupBox_HandleThemeChange(priv, window); } static void ALF_GroupBox_ClearPriv(ALFGroupBoxPriv *priv) { ALF_Layout_Clear(&priv->layout); + ALF_Compat_CloseThemeData(priv->theme); } static void -ALF_GroupBox_PaintFrameClassic(ALFGroupBoxPriv *priv, HWND hwnd, HDC dc) +ALF_GroupBox_PaintFrameUxtheme(ALFGroupBoxPriv *priv, HWND hwnd, HDC dc, RECT *rcPaint) { - (void)priv; + int state = IsWindowEnabled(hwnd) ? GBS_NORMAL : GBS_DISABLED; + + if (ALF_Compat_IsThemeBackgroundPartiallyTransparent(priv->theme, BP_GROUPBOX, state)) { + if (priv->layout.bgcolor == ALF_COLOR_TRANSPARENT) { + ALF_Compat_DrawThemeParentBackground(hwnd, dc, rcPaint); + } else { + ALF_FillRect(dc, rcPaint, priv->layout.bgcolor); + } + } + + RECT rc; + GetClientRect(hwnd, &rc); + + rc.top += priv->calculatedLabelSize.cy / 2; + + HRGN oldClipR = CreateRectRgn(0, 0, 0, 0); + if (!GetClipRgn(dc, oldClipR)) { + DeleteRgn(oldClipR); + oldClipR = NULL; + } + + RECT rcLabel; + GetWindowRect(priv->label, &rcLabel); + MapWindowRect(NULL, hwnd, &rcLabel); + + rcLabel.left -= 2; // FIXME: is this correct? + rcLabel.right += 2; + + ExcludeClipRect(dc, rcLabel.left, rcLabel.top, rcLabel.right, rcLabel.bottom); + + ALF_Compat_DrawThemeBackground(priv->theme, dc, BP_GROUPBOX, state, &rc, rcPaint); + + SelectClipRgn(dc, oldClipR); +} + +static void +ALF_GroupBox_PaintFrameClassic(ALFGroupBoxPriv *priv, HWND hwnd, HDC dc, RECT *rcPaint) +{ + if (priv->layout.bgcolor == ALF_COLOR_TRANSPARENT) { + ALF_Compat_DrawThemeParentBackground(hwnd, dc, rcPaint); + } else { + ALF_FillRect(dc, rcPaint, priv->layout.bgcolor); + } HFONT oldfont = SelectFont(dc, priv->layout.font); @@ -74,14 +126,10 @@ ALF_GroupBox_PaintFrameClassic(ALFGroupBoxPriv *priv, HWND hwnd, HDC dc) static void ALF_GroupBox_Paint(ALFGroupBoxPriv *priv, HWND hwnd, HDC dc, RECT *r) { - if (priv->layout.bgcolor == ALF_COLOR_TRANSPARENT) { - ALF_Compat_DrawThemeParentBackground(hwnd, dc, r); - } else { - ALF_FillRect(dc, r, priv->layout.bgcolor); - } - - // unthemed paint - ALF_GroupBox_PaintFrameClassic(priv, hwnd, dc); + if (priv->theme) + ALF_GroupBox_PaintFrameUxtheme(priv, hwnd, dc, r); + else + ALF_GroupBox_PaintFrameClassic(priv, hwnd, dc, r); } static void @@ -149,6 +197,29 @@ static void ALF_GroupBox_PreContainerWidgetApplyPos(ALFLayout *layout, HWND grou } } +static void +ALF_GroupBox_HandleThemeChange(ALFGroupBoxPriv *priv, HWND hwnd) +{ + if (priv->theme) + ALF_Compat_CloseThemeData(priv->theme); + + priv->theme = NULL; + + if (ALF_Compat_IsAppThemed()) + priv->theme = ALF_Compat_OpenThemeData(hwnd, L"BUTTON"); + + InvalidateRect(hwnd, NULL, TRUE); + + if (priv->theme) { + COLORREF textcolor = (COLORREF)ALF_COLOR_SYS(COLOR_BTNTEXT); + ALF_Compat_GetThemeColor(priv->theme, BP_GROUPBOX, GBS_NORMAL, TMT_TEXTCOLOR, &textcolor); + + ALF_SetTextColor(priv->label, (ALFColor)textcolor); + } else { + ALF_SetTextColor(priv->label, ALF_COLOR_SYS(COLOR_BTNTEXT)); + } +} + static LRESULT WINAPI ALF_GroupBox_WindowProc(HWND window, UINT msg, WPARAM wparam, LPARAM lparam) { @@ -246,6 +317,10 @@ ALF_GroupBox_WindowProc(HWND window, UINT msg, WPARAM wparam, LPARAM lparam) ALF_Layout_Apply(&priv->layout, window); } + if (msg == WM_THEMECHANGED) { + ALF_GroupBox_HandleThemeChange(priv, window); + } + if (msg == WM_ENABLE) { EnableWindow(priv->label, (BOOL)wparam); } -- cgit v1.2.3