user32: Handle magic font size 0x7fff in dialog templates correctly.

This commit is contained in:
Patrick Gauthier 2009-04-09 08:56:18 -04:00 committed by Alexandre Julliard
parent 2dc78e555b
commit 9096368b6a
2 changed files with 51 additions and 19 deletions

View File

@ -436,6 +436,21 @@ static LPCSTR DIALOG_ParseTemplate32( LPCSTR template, DLG_TEMPLATE * result )
{
result->pointSize = GET_WORD(p);
p++;
/* 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
{
if (result->dialogEx)
{
result->weight = GET_WORD(p); p++;
@ -443,10 +458,12 @@ static LPCSTR DIALOG_ParseTemplate32( LPCSTR template, DLG_TEMPLATE * result )
}
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 */
return (LPCSTR)(((UINT_PTR)p + 3) & ~3);
@ -491,17 +508,32 @@ static HWND DIALOG_CreateIndirect( HINSTANCE hInst, LPCVOID dlgTemplate,
/* Create custom font if needed */
if (template.style & DS_SETFONT)
{
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 */
HDC dc;
int pixels;
dc = GetDC(0);
pixels = MulDiv(template.pointSize, GetDeviceCaps(dc , LOGPIXELSY), 72);
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;

View File

@ -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;
}