Sind Sie auf .NET 2.0 beschränkt? In .NET 3.0 oder höher gibt es die GlyphTypeface
Klasse, die eine Schriftartdatei laden kann und die CharacterToGlyphMap
Eigenschaft, die meiner Meinung nach das tun kann, was Sie wollen.
In .NET 2.0, ich denke, Sie müssen sich auf PInvoke verlassen. Versuchen Sie etwas wie:
using System.Drawing;
using System.Runtime.InteropServices;
[DllImport("gdi32.dll", EntryPoint = "GetGlyphIndicesW")]
private static extern uint GetGlyphIndices([In] IntPtr hdc, [In] [MarshalAs(UnmanagedType.LPTStr)] string lpsz, int c, [Out] ushort[] pgi, uint fl);
[DllImport("gdi32.dll")]
private static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj);
private const uint GGI_MARK_NONEXISTING_GLYPHS = 0x01;
// Create a dummy Graphics object to establish a device context
private Graphics _graphics = Graphics.FromImage(new Bitmap(1, 1));
public bool DoesGlyphExist(char c, Font font)
{
// Get a device context from the dummy Graphics
IntPtr hdc = _graphics.GetHdc();
ushort[] glyphIndices;
try {
IntPtr hfont = font.ToHfont();
// Load the font into the device context
SelectObject(hdc, hfont);
string testString = new string(c, 1);
glyphIndices = new ushort[testString.Length];
GetGlyphIndices(hdc, testString, testString.Length, glyphIndices, GGI_MARK_NONEXISTING_GLYPHS);
} finally {
// Clean up our mess
_graphics.ReleaseHdc(hdc);
}
// 0xffff is the value returned for a missing glyph
return (glyphIndices[0] != 0xffff);
}
private void Test()
{
Font f = new Font("Courier New", 10);
// Glyph for A is found -- returns true
System.Diagnostics.Debug.WriteLine(DoesGlyphExist('A', f).ToString());
// Glyph for is not found -- returns false
System.Diagnostics.Debug.WriteLine(DoesGlyphExist((char) 0xca0, f).ToString());
}