4 Stimmen

C#: Prüfung auf nicht unterstützte Zeichen/Glyphen in einer Schriftart

Ich arbeite an einem Add-In für eine Übersetzungssoftware (C#, .NET 2.0), die übersetzte Texte auf einem emulierten Gerätedisplay anzeigt. Ich muss überprüfen, ob alle übersetzten Texte mit bestimmten Schriftarten (Windows TTF) angezeigt werden können. Aber ich habe keine Möglichkeit gefunden, eine Schriftart auf nicht unterstützte Glyphen zu prüfen. Hat jemand eine Idee?

Danke

9voto

Jeremy Todd Punkte 3201

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X