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
|
#include "alfpriv.h"
typedef struct {
ALFAPP app;
ALFLayout layout;
} ALFPanelPriv;
static void
ALF_Panel_IntializePriv(ALFPanelPriv *priv, ALFAPP app)
{
priv->app = app;
ALF_Layout_Init(&priv->layout);
}
static void
ALF_Panel_ClearPriv(ALFPanelPriv *priv)
{
ALF_Layout_Clear(&priv->layout);
}
static LRESULT WINAPI
ALF__PanelWindowProc(HWND window, UINT msg, WPARAM wparam, LPARAM lparam)
{
if (msg == WM_NCCREATE) {
ALFPanelPriv *p = ALF_New(ALFPanelPriv, 1);
ALFAPP app = (ALFAPP)(((CREATESTRUCT*)lparam)->lpCreateParams);
ALF_Panel_IntializePriv(p, app);
SetWindowLongPtr(window, 0, (LONG_PTR)p);
}
ALFPanelPriv *priv = (ALFPanelPriv *)GetWindowLongPtr(window, 0);
if (msg == WM_NCDESTROY) {
ALF_Panel_ClearPriv(priv);
ALF_Free(priv);
SetWindowLongPtr(window, 0, 0);
}
if (ALF_ShouldMessageBubble(window, msg, wparam, lparam))
return SendMessage(GetParent(window), msg, wparam, lparam);
if (msg == WM_SIZE) {
ALF_Layout_Apply(&priv->layout, window);
}
LRESULT ret = 0;
if (ALF_Layout_HandleMessage(&priv->layout, window, msg, wparam, lparam, &ret))
return ret;
return DefWindowProc(window, msg, wparam, lparam);
}
void
ALF_RegisterPanelClass(ALFAPP app)
{
WNDCLASS cls;
ZeroMemory(&cls, sizeof(cls));
TCHAR classNameBuf[256];
ALF_BuildRandomClassName(TEXT("ALFPanel"), classNameBuf, 256);
cls.hInstance = app->hInstance;
cls.hCursor = LoadCursor(NULL, (LPTSTR)IDC_ARROW);
if (LOBYTE(LOWORD(GetVersion())) >= 4) {
cls.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
} else {
// NT 3.x has white dialog backgrounds
cls.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
}
cls.lpszClassName = classNameBuf;
cls.cbWndExtra = sizeof(void*);
cls.lpfnWndProc = ALF__PanelWindowProc;
ATOM classatom = RegisterClass(&cls);
if (!classatom)
MessageBox(NULL, TEXT("FATAL: Could not register Combo class"), NULL, MB_OK);
app->panelClass = MAKEINTATOM(classatom);
}
HWND
ALF_AddPanel(HWND parent, WORD id, UINT x, UINT y)
{
ALFAPP app = ALF_ApplicationFromWindow(parent);
HWND hwndPanel = CreateWindowEx(WS_EX_CONTROLPARENT,
app->panelClass,
TEXT(""),
WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN,
0, 0, 0, 0,
parent,
(HMENU)(int)id,
(HINSTANCE)GetWindowLongPtr(parent, GWLP_HINSTANCE),
(void*)app);
ALFWidgetLayoutParams p;
ZeroMemory(&p, sizeof(p));
p.hwnd = hwndPanel;
p.x = x;
p.y = y;
p.width = 0;
p.height = 0;
p.flags = ALF_QUERYSIZE | ALF_SENDAPPLYFONTS;
ALF_AddWidgetEx(parent, &p);
return hwndPanel;
}
|