Module: wine Branch: master Commit: 9096368b6a7dbc456d4f2b80da09c1da400afab5 URL: http://source.winehq.org/git/wine.git/?a=commit;h=9096368b6a7dbc456d4f2b80da...
Author: Patrick Gauthier webmaster@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; }