Patrick Gauthier : user32: Handle magic font size 0x7fff in dialog templates correctly.
Alexandre Julliard
julliard at winehq.org
Fri Apr 10 08:10:15 CDT 2009
Module: wine
Branch: master
Commit: 9096368b6a7dbc456d4f2b80da09c1da400afab5
URL: http://source.winehq.org/git/wine.git/?a=commit;h=9096368b6a7dbc456d4f2b80da09c1da400afab5
Author: Patrick Gauthier <webmaster at korosoft.net>
Date: Thu Apr 9 08:56:18 2009 -0400
user32: Handle magic font size 0x7fff in dialog templates correctly.
---
dlls/user32/dialog.c | 68 ++++++++++++++++++++++++++++++++-----------
dlls/user32/tests/dialog.c | 2 +-
2 files changed, 51 insertions(+), 19 deletions(-)
diff --git a/dlls/user32/dialog.c b/dlls/user32/dialog.c
index bbe3ee2..5710807 100644
--- a/dlls/user32/dialog.c
+++ b/dlls/user32/dialog.c
@@ -436,16 +436,33 @@ static LPCSTR DIALOG_ParseTemplate32( LPCSTR template, DLG_TEMPLATE * result )
{
result->pointSize = GET_WORD(p);
p++;
- if (result->dialogEx)
+
+ /* If pointSize is 0x7fff, it means that we need to use the font
+ * in NONCLIENTMETRICSW.lfMessageFont, and NOT read the weight,
+ * italic, and facename from the dialog template.
+ */
+ if (result->pointSize == 0x7fff)
+ {
+ /* We could call SystemParametersInfo here, but then we'd have
+ * to convert from pixel size to point size (which can be
+ * imprecise).
+ */
+ TRACE(" FONT: Using message box font\n");
+ }
+ else
{
- result->weight = GET_WORD(p); p++;
- result->italic = LOBYTE(GET_WORD(p)); p++;
+ if (result->dialogEx)
+ {
+ result->weight = GET_WORD(p); p++;
+ result->italic = LOBYTE(GET_WORD(p)); p++;
+ }
+ result->faceName = p;
+ p += strlenW( result->faceName ) + 1;
+
+ TRACE(" FONT %d, %s, %d, %s\n",
+ result->pointSize, debugstr_w( result->faceName ),
+ result->weight, result->italic ? "TRUE" : "FALSE" );
}
- result->faceName = p;
- p += strlenW( result->faceName ) + 1;
- TRACE(" FONT %d, %s, %d, %s\n",
- result->pointSize, debugstr_w( result->faceName ),
- result->weight, result->italic ? "TRUE" : "FALSE" );
}
/* First control is on dword boundary */
@@ -492,16 +509,31 @@ static HWND DIALOG_CreateIndirect( HINSTANCE hInst, LPCVOID dlgTemplate,
if (template.style & DS_SETFONT)
{
- /* We convert the size to pixels and then make it -ve. This works
- * for both +ve and -ve template.pointSize */
- HDC dc;
- int pixels;
- dc = GetDC(0);
- pixels = MulDiv(template.pointSize, GetDeviceCaps(dc , LOGPIXELSY), 72);
- hUserFont = CreateFontW( -pixels, 0, 0, 0, template.weight,
- template.italic, FALSE, FALSE, DEFAULT_CHARSET, 0, 0,
- PROOF_QUALITY, FF_DONTCARE,
- template.faceName );
+ HDC dc = GetDC(0);
+
+ if (template.pointSize == 0x7fff)
+ {
+ /* We get the message font from the non-client metrics */
+ NONCLIENTMETRICSW ncMetrics;
+
+ ncMetrics.cbSize = sizeof(NONCLIENTMETRICSW);
+ if (SystemParametersInfoW(SPI_GETNONCLIENTMETRICS,
+ sizeof(NONCLIENTMETRICSW), &ncMetrics, 0))
+ {
+ hUserFont = CreateFontIndirectW( &ncMetrics.lfMessageFont );
+ }
+ }
+ else
+ {
+ /* We convert the size to pixels and then make it -ve. This works
+ * for both +ve and -ve template.pointSize */
+ int pixels = MulDiv(template.pointSize, GetDeviceCaps(dc , LOGPIXELSY), 72);
+ hUserFont = CreateFontW( -pixels, 0, 0, 0, template.weight,
+ template.italic, FALSE, FALSE, DEFAULT_CHARSET, 0, 0,
+ PROOF_QUALITY, FF_DONTCARE,
+ template.faceName );
+ }
+
if (hUserFont)
{
SIZE charSize;
diff --git a/dlls/user32/tests/dialog.c b/dlls/user32/tests/dialog.c
index 7f8dfae..060625c 100644
--- a/dlls/user32/tests/dialog.c
+++ b/dlls/user32/tests/dialog.c
@@ -999,7 +999,7 @@ static void test_MessageBoxFontTest(void)
hDlg = CreateDialogIndirectParamW(g_hinst, (LPCDLGTEMPLATE)dlgTemplate, NULL, messageBoxFontDlgWinProc, 0);
if (!hDlg)
{
- todo_wine win_skip("dialog wasn't created\n");
+ win_skip("dialog wasn't created\n");
return;
}
More information about the wine-cvs
mailing list