1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
#include "alfpriv.h"
typedef struct {
ALFColor bgcolor;
WNDPROC origWndProc;
} ALFCheckboxPriv;
static ALFCheckboxPriv *
ALF_Checkbox_InitializePriv(void)
{
return ALF_New(ALFCheckboxPriv, 1);
}
static void
ALF_Checkbox_FreePriv(ALFCheckboxPriv *priv)
{
ALF_Free(priv);
}
static BOOL
ALF_Checkbox_IsTransparencySupported(void)
{
// FIXME: for safety, check if the control is actually a v6 control
return ALF_Compat_IsAppThemed();
}
static LRESULT
ALF_Checkbox_PaintBackground(HWND window, ALFCheckboxPriv *priv, HDC hDC)
{
// FIXME: Drawing the (transparent) background in WM_CTLCOLORSTATIC is
// only supported in a themed V6 common control
SetTextColor(hDC, GetSysColor(COLOR_BTNTEXT));
if (ALF_Checkbox_IsTransparencySupported()) {
RECT r;
GetClientRect(window, &r);
if (priv->bgcolor == ALF_COLOR_TRANSPARENT) {
ALF_Compat_DrawThemeParentBackground(window, hDC, &r);
SetBkMode(hDC, TRANSPARENT);
} else {
ALF_FillRect(hDC, &r, priv->bgcolor);
SetBkMode(hDC, OPAQUE);
SetBkColor(hDC, ALF_ColorToGdi(priv->bgcolor));
}
return (LRESULT)GetStockObject(HOLLOW_BRUSH);
} else {
SetBkColor(hDC, GetSysColor(COLOR_BTNFACE));
SetBkMode(hDC, OPAQUE);
return (LRESULT)GetSysColorBrush(COLOR_BTNFACE);
}
}
static LRESULT CALLBACK
ALF_Checkbox_WindowProc(HWND window, UINT msg, WPARAM wparam, LPARAM lparam)
{
ALFCheckboxPriv *priv = (ALFCheckboxPriv *)GetWindowLongPtr(window, GWLP_USERDATA);
if (!priv) // fuck
return DefWindowProc(window, msg, wparam, lparam);
if (msg == ALF_WM_SETBGCOLOR) {
ALFColor newColor = (ALFColor)lparam;
if (newColor != priv->bgcolor) {
priv->bgcolor = newColor;
if (ALF_Checkbox_IsTransparencySupported())
InvalidateRect(window, NULL, TRUE);
}
return TRUE;
}
if (msg == 0x2000 + WM_CTLCOLORSTATIC) {
return ALF_Checkbox_PaintBackground(window, priv, (HDC)wparam);
}
if (msg == ALF_WM_BACKGROUNDCHANGE) {
if (priv->bgcolor == ALF_COLOR_TRANSPARENT && ALF_Checkbox_IsTransparencySupported()) {
InvalidateRect(window, NULL, TRUE);
}
return TRUE;
}
if (msg == WM_THEMECHANGED) {
InvalidateRect(window, NULL, TRUE);
}
if (msg == WM_DESTROY) {
WNDPROC orig = priv->origWndProc;
SetWindowLongPtr(window, GWLP_WNDPROC, (LONG_PTR)orig);
SetWindowLongPtr(window, GWLP_USERDATA, 0);
ALF_Checkbox_FreePriv(priv);
return CallWindowProc(orig, window, msg, wparam, lparam);
}
return CallWindowProc(priv->origWndProc, window, msg, wparam, lparam);
}
HWND
ALF_AddCheckbox(HWND parent, WORD id, int x, int y, const TCHAR *text)
{
HWND hwnd = CreateWindowEx(0,
TEXT("BUTTON"),
text,
WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_AUTOCHECKBOX,
0, 0, 100, 100,
parent,
(HMENU)(ULONG_PTR)id,
ALF_HINSTANCE,
NULL);
ALFCheckboxPriv *priv = ALF_Checkbox_InitializePriv();
SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)priv);
priv->origWndProc = (WNDPROC)SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)ALF_Checkbox_WindowProc);
ALF_AddWidget(parent, x, y, hwnd, 0, 0, ALF_LAYOUT_SIZE_CHECKBOX | ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_INHERITBGCOLOR | ALF_LAYOUT_SENDBGCHANGE);
return hwnd;
}
|