C#中:检查字体不支持的字符/字形 [英] C#: Check for unsupported characters/glyphs in a font
问题描述
我工作的一个翻译软件加入(C#,.NET 2.0),这在模拟设备显示器显示翻译文本。 我要检查,如果所有的翻译文本可与指定的字体(TTF的Windows)来显示。 但我没有发现任何的方法来检查的字体不支持的字形。 有没有人有一个想法?
I am working on a translation software add in (C#, .NET 2.0) which displays translated texts in a emulated device display. I have to check if all translated texts could be displayed with specified fonts (Windows TTF). But I didn't found any way to check a font for unsupported glyphs. Does anyone have an idea?
感谢
推荐答案
您仅限于.NET 2.0?在.NET 3.0或更高版本,还有的 GlyphTypeface
类,它可以加载一个字体文件,并公开 CharacterToGlyphMap
属性,我相信可以做你想做的。
Are you limited to .NET 2.0? In .NET 3.0 or higher, there's the GlyphTypeface
class, which can load a font file and exposes the CharacterToGlyphMap
property, which I believe can do what you want.
在.NET 2.0,我认为你必须依靠的PInvoke。尝试是这样的:
In .NET 2.0, I think you'll have to rely on PInvoke. Try something like:
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());
}
这篇关于C#中:检查字体不支持的字符/字形的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!