GetCharABCWidths (gdi32)
Last changed: -91.208.24.18

.
Summary

C# Signature:

    [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);

User-Defined Types:

    [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);
        }
    }

Notes:

None.

Tips & Tricks:

Please add some!

Sample Code:

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];
    }

Alternative Managed API:

Do you know one? Please contribute it!

Documentation