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
|
#include "alfpriv.h"
/* LABEL */
static
int ALF__LabelTopPadding(HWND hwnd)
{
// some pixels on top to align with the edit control
// see also: alfedit.cpp
return ALF_Compat_GetSystemMetricsForDpi(
SM_CYEDGE, ALF_CentipointsToPixels(GetParent(hwnd), 7200))
+ ((LOBYTE(LOWORD(GetVersion())) < 4) ? 2 : 1) /* internal padding in edit control */
+ 1 /* external padding around edit control */;
}
static LRESULT CALLBACK
ALF__LabelSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
(void)uIdSubclass;
(void)dwRefData;
if (uMsg == ALF_WM_QUERYSIZE) {
HDC hdcLabel = GetDC(hwnd);
HFONT font = (HFONT)SendMessage(hwnd, WM_GETFONT, 0, 0);
HFONT oldFont = 0;
if (font)
oldFont = SelectFont(hdcLabel, font);
// calc drawtext style
DWORD style = GetWindowLong(hwnd, GWL_STYLE);
UINT format = DT_LEFT | DT_EXPANDTABS | DT_CALCRECT;
if (style & SS_NOPREFIX)
format |= DT_NOPREFIX;
if (style & SS_EDITCONTROL)
format |= DT_EDITCONTROL;
if (style & SS_ENDELLIPSIS || style & SS_PATHELLIPSIS || style & SS_WORDELLIPSIS)
format |= DT_SINGLELINE;
RECT r = { 0, 0, 100, 100 };
int textlen = GetWindowTextLength(hwnd);
TCHAR *textbuf = ALF_New(TCHAR, textlen + 1);
GetWindowText(hwnd, textbuf, textlen+1);
DrawText(hdcLabel, textbuf, -1, &r, format);
ALF_Free(textbuf);
SIZE *pSize = (SIZE*)(void*)lParam;
if (pSize->cx == 0)
pSize->cx = r.right - r.left;
if (pSize->cy == 0)
pSize->cy = r.bottom - r.top + ALF__LabelTopPadding(hwnd);
if (font)
SelectFont(hdcLabel, oldFont);
ReleaseDC(hwnd, hdcLabel);
} else if (uMsg == ALF_WM_APPLYSIZE) {
RECT *p = (RECT *)lParam;
int topPadding = ALF__LabelTopPadding(hwnd);
return (LRESULT)DeferWindowPos((HDWP)wParam,
hwnd, NULL,
p->left, p->top + topPadding,
p->right - p->left, p->bottom - p->top - topPadding,
SWP_NOZORDER|SWP_NOACTIVATE);
} else if (uMsg == WM_DESTROY) {
ALF_Compat_RemoveWindowSubclass(hwnd, ALF__LabelSubclassProc, 0);
}
return ALF_Compat_DefSubclassProc(hwnd, uMsg, wParam, lParam);
}
HWND
ALF_AddLabel(HWND win, WORD id, UINT x, UINT y, const TCHAR *text)
{
HWND hwndLabel = CreateWindow(TEXT("STATIC"),
text,
WS_CHILD | WS_VISIBLE | SS_LEFTNOWORDWRAP,
0, 0, 100, 100,
win,
(HMENU)(int)id,
(HINSTANCE)GetWindowLongPtr(win, GWLP_HINSTANCE),
NULL);
ALF_Compat_SetWindowSubclass(hwndLabel, ALF__LabelSubclassProc, 0, 0);
ALFWidgetLayoutParams p;
ZeroMemory(&p, sizeof(p));
p.hwnd = hwndLabel;
p.x = x;
p.y = y;
p.width = 0;
p.height = 0;
p.flags = ALF_QUERYSIZE | ALF_APPLYSIZE | ALF_MESSAGEFONT;
ALF_AddWidgetEx(win, &p);
return hwndLabel;
}
|