我正在打印使用该字体安装的每种字体的名称,除非该字体使名称不可读(即符号),我使用默认字体(Segoe UI)。
现在,我正在尝试以下方法并找到了一些我无法理解的内容:
var installedFonts = new System.Drawing.Text.InstalledFontCollection().Families;
foreach (var family in installedFonts)
{
var font = new Font(family, 12);
if (font.GdiCharSet == 2) // Symbols font
{
// Print using default font
}
else // Readable font
{
// Print using font
}
}
它永远不会使用默认字体打印。此外,即使字体使用不同的字符集,每个字体GdiCharSet
都会返回1
。读得更彻底,它说:
此属性返回1,除非在
Font(String, Single, FontStyle, GraphicsUnit, Byte)
构造函数中指定了不同的字符集。
所以,显然我没有正确创建字体,因为我没有指定Byte
值(我完全使用不同的构造函数)。这让我觉得有另一种方式("实际"方式)来了解字体的CharSet
值。但我无法在任何地方找到它。有谁知道我怎么能找到这个?
作为旁注,Notepad设法做到这一点。格式>字体...打开字体选择器。您可以看到它显示在脚本下使用的字符集。
答案 0 :(得分:1)
您应该使用GetTextMetrics
函数(https://msdn.microsoft.com/en-us/library/windows/desktop/dd144941(v=vs.85).aspx)。使用interop调用时,它会检索以下结构:
[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Auto)]
internal struct TEXTMETRIC
{
public int tmHeight;
public int tmAscent;
public int tmDescent;
public int tmInternalLeading;
public int tmExternalLeading;
public int tmAveCharWidth;
public int tmMaxCharWidth;
public int tmWeight;
public int tmOverhang;
public int tmDigitizedAspectX;
public int tmDigitizedAspectY;
public char tmFirstChar;
public char tmLastChar;
public char tmDefaultChar;
public char tmBreakChar;
public byte tmItalic;
public byte tmUnderlined;
public byte tmStruckOut;
public byte tmPitchAndFamily;
public byte tmCharSet;
}
结构的最后一个成员tmCharSet
正是您所寻找的:
字体的字符集。字符集可以是其中之一 以下值:ANSI_CHARSET BALTIC_CHARSET CHINESEBIG5_CHARSET DEFAULT_CHARSET EASTEUROPE_CHARSET GB2312_CHARSET GREEK_CHARSET HANGUL_CHARSET MAC_CHARSET OEM_CHARSET RUSSIAN_CHARSET SHIFTJIS_CHARSET SYMBOL_CHARSET TURKISH_CHARSET VIETNAMESE_CHARSET ......
关注this link,您可以找到必要代码的简单实现。