STATE_DEFAULTED
} ButtonState;
-typedef void (*pfThemedPaint)(HTHEME theme, HWND hwnd, HDC hdc, ButtonState drawState, UINT dtFlags, BOOL focused);
+typedef void (*pfThemedPaint)(HTHEME theme, HWND hwnd, HDC hdc, ButtonState drawState, UINT dtFlags, BOOL focused, LPARAM prfFlag);
+
+static inline LONG get_button_state( HWND hwnd )
+{
+ return _GetButtonData(hwnd)->state;
+}
+
+static inline HFONT get_button_font( HWND hwnd )
+{
+ return (HFONT)_GetButtonData(hwnd)->font;
+}
+
+static inline LONG_PTR get_button_image(HWND hwnd)
+{
+ return _GetButtonData(hwnd)->image;
+}
static UINT get_drawtext_flags(DWORD style, DWORD ex_style)
{
return text;
}
-static void PB_draw(HTHEME theme, HWND hwnd, HDC hDC, ButtonState drawState, UINT dtFlags, BOOL focused)
+static void PB_draw(HTHEME theme, HWND hwnd, HDC hDC, ButtonState drawState, UINT dtFlags, BOOL focused, LPARAM prfFlag)
{
static const int states[] = { PBS_NORMAL, PBS_DISABLED, PBS_HOT, PBS_PRESSED, PBS_DEFAULTED };
RECT bgRect, textRect;
- HFONT font = (HFONT)SendMessageW(hwnd, WM_GETFONT, 0, 0);
+ HFONT font = get_button_font(hwnd);
HFONT hPrevFont = font ? SelectObject(hDC, font) : NULL;
int state = states[ drawState ];
WCHAR *text = get_button_text(hwnd);
GetClientRect(hwnd, &bgRect);
GetThemeBackgroundContentRect(theme, hDC, BP_PUSHBUTTON, state, &bgRect, &textRect);
- if (IsThemeBackgroundPartiallyTransparent(theme, BP_PUSHBUTTON, state))
- DrawThemeParentBackground(hwnd, hDC, NULL);
+ if (prfFlag == 0 || (prfFlag & PRF_ERASEBKGND))
+ {
+ if (IsThemeBackgroundPartiallyTransparent(theme, BP_PUSHBUTTON, state))
+ DrawThemeParentBackground(hwnd, hDC, NULL);
+ }
+
DrawThemeBackground(theme, hDC, BP_PUSHBUTTON, state, &bgRect, NULL);
if (text)
{
if (hPrevFont) SelectObject(hDC, hPrevFont);
}
-static void CB_draw(HTHEME theme, HWND hwnd, HDC hDC, ButtonState drawState, UINT dtFlags, BOOL focused)
+static void CB_draw(HTHEME theme, HWND hwnd, HDC hDC, ButtonState drawState, UINT dtFlags, BOOL focused, LPARAM prfFlag)
{
static const int cb_states[3][5] =
{
SIZE sz;
RECT bgRect, textRect;
HFONT font, hPrevFont = NULL;
- LRESULT checkState = SendMessageW(hwnd, BM_GETCHECK, 0, 0);
+ LRESULT checkState = get_button_state(hwnd) & 3;
DWORD dwStyle = GetWindowLongW(hwnd, GWL_STYLE);
int part = ((dwStyle & BUTTON_TYPE) == BS_RADIOBUTTON) || ((dwStyle & BUTTON_TYPE) == BS_AUTORADIOBUTTON)
? BP_RADIOBUTTON
created_font = TRUE;
}
} else {
- font = (HFONT)SendMessageW(hwnd, WM_GETFONT, 0, 0);
+ font = get_button_font(hwnd);
hPrevFont = SelectObject(hDC, font);
}
bgRect.right = bgRect.left + sz.cx;
textRect.left = bgRect.right + 6;
- DrawThemeParentBackground(hwnd, hDC, NULL);
+ if (prfFlag == 0 || (prfFlag & PRF_ERASEBKGND))
+ {
+ DrawThemeParentBackground(hwnd, hDC, NULL);
+ }
DrawThemeBackground(theme, hDC, part, state, &bgRect, NULL);
if (text)
if (hPrevFont) SelectObject(hDC, hPrevFont);
}
-static void GB_draw(HTHEME theme, HWND hwnd, HDC hDC, ButtonState drawState, UINT dtFlags, BOOL focused)
+static void GB_draw(HTHEME theme, HWND hwnd, HDC hDC, ButtonState drawState, UINT dtFlags, BOOL focused, LPARAM prfFlag)
{
static const int states[] = { GBS_NORMAL, GBS_DISABLED, GBS_NORMAL, GBS_NORMAL, GBS_NORMAL };
created_font = TRUE;
}
} else {
- font = (HFONT)SendMessageW(hwnd, WM_GETFONT, 0, 0);
+ font = get_button_font(hwnd);
hPrevFont = SelectObject(hDC, font);
}
GetThemeBackgroundContentRect(theme, hDC, BP_GROUPBOX, state, &bgRect, &contentRect);
ExcludeClipRect(hDC, contentRect.left, contentRect.top, contentRect.right, contentRect.bottom);
- if (IsThemeBackgroundPartiallyTransparent(theme, BP_GROUPBOX, state))
- DrawThemeParentBackground(hwnd, hDC, NULL);
+ if (prfFlag == 0 || (prfFlag & PRF_ERASEBKGND))
+ {
+ if (IsThemeBackgroundPartiallyTransparent(theme, BP_GROUPBOX, state))
+ DrawThemeParentBackground(hwnd, hDC, NULL);
+ }
+
DrawThemeBackground(theme, hDC, BP_GROUPBOX, state, &bgRect, NULL);
SelectClipRgn(hDC, NULL);
NULL, /* Not defined */
};
-BOOL BUTTON_PaintWithTheme(HTHEME theme, HWND hwnd, HDC hParamDC)
+BOOL BUTTON_PaintWithTheme(HTHEME theme, HWND hwnd, HDC hParamDC, LPARAM prfFlag)
{
- DWORD dwStyle = GetWindowLongW(hwnd, GWL_STYLE);
- DWORD dwStyleEx = GetWindowLongW(hwnd, GWL_EXSTYLE);
- UINT dtFlags = get_drawtext_flags(dwStyle, dwStyleEx);
- int state = (int)SendMessageW(hwnd, BM_GETSTATE, 0, 0);
+ DWORD dwStyle;
+ DWORD dwStyleEx;
+ UINT dtFlags;
+ int state;
ButtonState drawState;
- pfThemedPaint paint = btnThemedPaintFunc[ dwStyle & BUTTON_TYPE ];
+ pfThemedPaint paint;
+
+ dwStyle = GetWindowLongW(hwnd, GWL_STYLE);
+ paint = btnThemedPaintFunc[ dwStyle & BUTTON_TYPE ];
if (!paint)
return FALSE;
+ if (get_button_image(hwnd) != 0)
+ return FALSE;
+
+ dwStyleEx = GetWindowLongW(hwnd, GWL_EXSTYLE);
+ dtFlags = get_drawtext_flags(dwStyle, dwStyleEx);
+ state = get_button_state(hwnd);
+
if(IsWindowEnabled(hwnd))
{
if(state & BST_PUSHED) drawState = STATE_PRESSED;
}
else drawState = STATE_DISABLED;
- paint(theme, hwnd, hParamDC, drawState, dtFlags, state & BST_FOCUS);
+ paint(theme, hwnd, hParamDC, drawState, dtFlags, state & BST_FOCUS, prfFlag);
return TRUE;
}