Patch by Robert Shearman rob@codeweavers.com, Use GdiGetCharDimensions Instead of...
authorJames Tabor <james.tabor@reactos.org>
Mon, 25 Jul 2005 04:21:29 +0000 (04:21 +0000)
committerJames Tabor <james.tabor@reactos.org>
Mon, 25 Jul 2005 04:21:29 +0000 (04:21 +0000)
svn path=/trunk/; revision=16722

reactos/lib/gdi32/objects/font.c
reactos/lib/user32/include/user32.h
reactos/lib/user32/windows/dialog.c

index 58108db..f5e89a1 100644 (file)
@@ -806,6 +806,12 @@ RemoveFontResourceA(
  *
  * 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
index e21ec11..33c413a 100644 (file)
@@ -33,5 +33,6 @@
 
 /* FIXME: FILIP */
 HGDIOBJ STDCALL  NtGdiSelectObject(HDC  hDC, HGDIOBJ  hGDIObj);
+DWORD STDCALL GdiGetCharDimensions(HDC, LPTEXTMETRICW, DWORD *);
 
 #endif /* USER32_H */
index f29f871..b61d492 100644 (file)
@@ -692,11 +692,14 @@ static HWND DIALOG_CreateIndirect( HINSTANCE hInst, LPCVOID dlgTemplate,
         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 @@ GetDialogBaseUnits(VOID)
 
         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 );
         }
     }