summaryrefslogtreecommitdiff
path: root/alf
diff options
context:
space:
mode:
Diffstat (limited to 'alf')
-rw-r--r--alf/alfgroupbox.cpp95
1 files changed, 85 insertions, 10 deletions
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);
}