[DllImport("gdi32.dll", CharSet = CharSet.Unicode)]
static extern bool GetTextMetrics(IntPtr hdc, out TEXTMETRIC lptm);
It's very important to use the Charset.Unicode attribute or you will get a runtime exception.
Please add some!
public static TEXTMETRIC GetTextMetrics(Graphics graphics, Font font)
{
IntPtr hDC = graphics.GetHdc();
TEXTMETRIC textMetric;
IntPtr hFont = font.ToHfont();
try
{
IntPtr hFontPreviouse = SelectObject(hDC, hFont);
bool result = GetTextMetrics(hDC, out textMetric);
SelectObject(hDC, hFontPreviouse);
}
finally
{
DeleteObject(hFont);
graphics.ReleaseHdc(hDC);
}
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)]
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;
}
Do you know one? Please contribute it!