Patch by Robert Shearman rob@codeweavers.com, Use GdiGetCharDimensions Instead of DIALOG_GetCharSize. Modified: trunk/reactos/lib/gdi32/objects/font.c Modified: trunk/reactos/lib/user32/include/user32.h Modified: trunk/reactos/lib/user32/windows/dialog.c _____
Modified: trunk/reactos/lib/gdi32/objects/font.c --- trunk/reactos/lib/gdi32/objects/font.c 2005-07-24 22:17:02 UTC (rev 16721) +++ trunk/reactos/lib/gdi32/objects/font.c 2005-07-25 04:21:29 UTC (rev 16722) @@ -806,6 +806,12 @@
* * SEE ALSO * GetTextExtentPointW, GetTextMetricsW, MapDialogRect. + * + * Despite most of MSDN insisting that the horizontal base unit is + * tmAveCharWidth it isn't. Knowledge base article Q145994 + * "HOWTO: Calculate Dialog Units When Not Using the System Font", + * says that we should take the average of the 52 English upper and lower + * case characters. */ /* * @implemented _____
Modified: trunk/reactos/lib/user32/include/user32.h --- trunk/reactos/lib/user32/include/user32.h 2005-07-24 22:17:02 UTC (rev 16721) +++ trunk/reactos/lib/user32/include/user32.h 2005-07-25 04:21:29 UTC (rev 16722) @@ -33,5 +33,6 @@
/* FIXME: FILIP */ HGDIOBJ STDCALL NtGdiSelectObject(HDC hDC, HGDIOBJ hGDIObj); +DWORD STDCALL GdiGetCharDimensions(HDC, LPTEXTMETRICW, DWORD *);
#endif /* USER32_H */ _____
Modified: trunk/reactos/lib/user32/windows/dialog.c --- trunk/reactos/lib/user32/windows/dialog.c 2005-07-24 22:17:02 UTC (rev 16721) +++ trunk/reactos/lib/user32/windows/dialog.c 2005-07-25 04:21:29 UTC (rev 16722) @@ -692,11 +692,14 @@
if (dlgInfo->hUserFont) { SIZE charSize; - if (DIALOG_GetCharSize( dc, dlgInfo->hUserFont, &charSize )) + HFONT hOldFont = SelectObject( dc, dlgInfo->hUserFont ); + charSize.cx = GdiGetCharDimensions( dc, NULL, &charSize.cy ); + if (charSize.cx) { dlgInfo->xBaseUnit = charSize.cx; dlgInfo->yBaseUnit = charSize.cy; } + SelectObject( dc, hOldFont ); } ReleaseDC(0, dc); } @@ -1828,7 +1831,8 @@
if ((hdc = GetDC(0))) { - if (DIALOG_GetCharSize( hdc, 0, &size )) units = MAKELONG( size.cx, size.cy ); + size.cx = GdiGetCharDimensions( hdc, NULL, &size.cy ); + if (size.cx) units = MAKELONG( size.cx, size.cy ); ReleaseDC( 0, hdc ); } }