GetTextMetrics (gdi32)
Last changed: Szymon Katra-


C# Signature:

[DllImport("gdi32.dll", CharSet = CharSet.Auto)]
static extern bool GetTextMetrics(IntPtr hdc, out TEXTMETRIC lptm);

User-Defined Types:



It's very important to use the same charset on the TEXTMETRIC structure and the extern function.

Tips & Tricks:

Please add some!

Sample Code:

public static TEXTMETRIC GetTextMetrics(Graphics graphics, Font font)
   IntPtr hDC = graphics.GetHdc();
   TEXTMETRIC textMetric;
   IntPtr hFont = font.ToHfont();
     IntPtr hFontPreviouse = SelectObject(hDC, hFont);
     bool result = GetTextMetrics(hDC, out textMetric);
     SelectObject(hDC, hFontPreviouse);
   return textMetric;

[DllImport("Gdi32.dll", CharSet=CharSet.Unicode)]
static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj);

[DllImport("Gdi32.dll", CharSet=CharSet.Unicode)]
static extern bool GetTextMetrics(IntPtr hdc, out TEXTMETRIC lptm);

[DllImport("Gdi32.dll", CharSet=CharSet.Unicode)]
static extern bool DeleteObject(IntPtr hdc);

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
internal struct TEXTMETRIC
   public int tmHeight;
   public int tmAscent;
   public int tmDescent;
   public int tmInternalLeading;
   public int tmExternalLeading;
   public int tmAveCharWidth;
   public int tmMaxCharWidth;
   public int tmWeight;
   public int tmOverhang;
   public int tmDigitizedAspectX;
   public int tmDigitizedAspectY;
   public char tmFirstChar;
   public char tmLastChar;
   public char tmDefaultChar;
   public char tmBreakChar;
   public byte tmItalic;
   public byte tmUnderlined;
   public byte tmStruckOut;
   public byte tmPitchAndFamily;
   public byte tmCharSet;

// C++/CLI

[StructLayout(LayoutKind::Sequential, CharSet=CharSet::Unicode)]

public ref struct TEXTMETRIC


   int tmHeight;
   int tmAscent;
   int tmDescent;
   int tmInternalLeading;
   int tmExternalLeading;
   int tmAveCharWidth;
   int tmMaxCharWidth;
   int tmWeight;
   int tmOverhang;
   int tmDigitizedAspectX;
   int tmDigitizedAspectY;
   Char tmFirstChar;
   Char tmLastChar;
   Char tmDefaultChar;
   Char tmBreakChar;
   Byte tmItalic;
   Byte tmUnderlined;
   Byte tmStruckOut;
   Byte tmPitchAndFamily;
   Byte tmCharSet;


[DllImport("Gdi32.dll", CharSet=CharSet::Unicode)]

static bool GetTextMetrics(IntPtr hdc, Out TEXTMETRIC% lptm);

TEXTMETRIC^ GetTextMetricsReal(Graphics^ g, Font^ font)


   IntPtr hDC = g->GetHdc();
   TEXTMETRIC^ textMetric = gcnew TEXTMETRIC;
   IntPtr hFont = font->ToHfont();
      IntPtr hFontPrevious = Win32::SelectObject(hDC, hFont);
      bool result = Win32::GetTextMetrics(hDC, *textMetric);
      Win32::SelectObject(hDC, hFontPrevious);

   return textMetric;


Alternative Managed API:

Do you know one? Please contribute it!