[DllImport("gdi32.dll", EntryPoint = "GetCharABCWidthsW", SetLastError = true)]
static extern unsafe bool GetCharABCWidthsW(IntPtr hdc, uint uFirstChar,
uint uLastChar, ABC* lpabc);
[DllImport("gdi32.dll", EntryPoint = "GetCharABCWidthsA", SetLastError = true)]
static extern unsafe bool GetCharABCWidthsA(IntPtr hdc, uint uFirstChar,
uint uLastChar, ABC* lpabc);
[StructLayout(LayoutKind.Sequential)]
public struct ABC
{
public int abcA;
public uint abcB;
public int abcC;
public override string ToString()
{
return string.Format("A={0}, B={1}, C={2}", abcA, abcB, abcC);
}
}
None.
Please add some!
The following method can be used to get the width of a single character. Change to W for unicode
/// <summary>
/// Gets the width of an ANSI true type font character
/// </summary>
/// <param name="g">The graphics object</param>
/// <param name="f">The font, note that all Fonts encapsulated
/// in a Font object are True Type.</param>
/// <param name="c">The character</param>
public static ABC GetCharABCWidthsA_(Graphics g, Font f, char c)
{
IntPtr hDC = g.GetHdc();
W32.ABC[] abc_array = new ABC[1];
IntPtr abcptr = Marshal.UnsafeAddrOfPinnedArrayElement(abc_array, 0);
IntPtr hFont = f.ToHfont();
try
{
IntPtr hFontPreviouse = W32.SelectObject(hDC, hFont);
uint ci = (uint)c;
bool result = W32.GetCharABCWidthsA(hDC, (uint) c, (uint) c, abcptr);
W32.SelectObject(hDC, hFontPreviouse);
if (!result) //Propper error handeling..? Naahh
Console.WriteLine("Did not find ABC: " + f.ToString());
}
finally
{
W32.DeleteObject(hFont);
g.ReleaseHdc(hDC);
}
return abc_array[0];
}
Do you know one? Please contribute it!