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
|
#include "MirandaFont.h"
MirandaFont::MirandaFont(Field *aField, const char *description)
: field(aField), hFont(NULL)
{
ZeroMemory(&fid, sizeof(fid));
lstrcpyn(fid.name, CharToTchar(description), sizeof(fid.name));
}
MirandaFont::~MirandaFont()
{
releaseFont();
}
void MirandaFont::registerFont(FontState *font)
{
if (fid.cbSize != 0)
return;
MirandaSkinnedDialog * dlg = (MirandaSkinnedDialog *) field->getDialog();
HDC hdc = GetDC(NULL);
fid.cbSize = sizeof(fid);
lstrcpyn(fid.group, CharToTchar(dlg->getDescription()), sizeof(fid.group));
strncpy(fid.dbSettingsGroup, dlg->getModule(), sizeof(fid.dbSettingsGroup));
char tmp[sizeof(fid.prefix)];
mir_snprintf(tmp, sizeof(tmp), "%s%s%sFont", TcharToChar(dlg->getSkinName()), dlg->getName(), field->getName());
strncpy(fid.prefix, tmp, sizeof(fid.prefix));
fid.deffontsettings.colour = font->getColor();
fid.deffontsettings.size = -MulDiv(font->getSize(), GetDeviceCaps(hdc, LOGPIXELSY), 72);
fid.deffontsettings.style = (font->isBold() ? DBFONTF_BOLD : 0)
| (font->isItalic() ? DBFONTF_ITALIC : 0)
| (font->isUnderline() ? DBFONTF_UNDERLINE : 0)
| (font->isStrikeOut() ? DBFONTF_STRIKEOUT : 0);
fid.deffontsettings.charset = DEFAULT_CHARSET;
lstrcpyn(fid.deffontsettings.szFace, font->getFace(), sizeof(fid.deffontsettings.szFace));
fid.order = dlg->getIndexOf(field);
fid.flags = FIDF_DEFAULTVALID | FIDF_ALLOWEFFECTS;
CallService(MS_FONT_REGISTERT, (WPARAM)&fid, 0);
ReleaseDC(NULL, hdc);
HookEventObj(ME_FONT_RELOAD, staticReloadFont, this);
reloadFont();
}
void MirandaFont::reloadFont()
{
releaseFont();
LOGFONT log_font;
COLORREF color = (COLORREF) CallService(MS_FONT_GETT, (WPARAM) &fid, (LPARAM) &log_font);
hFont = CreateFontIndirect(&log_font);
switch(field->getType())
{
case SIMPLE_TEXT:
((TextField *) field)->setFontColor(color);
((TextField *) field)->setFont(hFont);
break;
case CONTROL_LABEL:
case CONTROL_BUTTON:
case CONTROL_EDIT:
((ControlField *) field)->setFont(hFont);
break;
}
}
int MirandaFont::staticReloadFont(void *obj, WPARAM wParam, LPARAM lParam)
{
((MirandaFont *) obj)->reloadFont();
return 0;
}
void MirandaFont::releaseFont()
{
if (hFont != NULL)
{
DeleteObject(hFont);
hFont = NULL;
}
}
|