C#:从逻辑字体(LOGFONT)创建字体 - 忽略质量设置

时间:2010-11-25 03:07:35

标签: c# winapi fonts typography cleartype

我正在尝试使用P / Invoke和Font.FromLogFont从LOGFONT创建System.Drawing.Font。 已创建请求的字体,但它始终具有相同的渲染质量 - 无论我将哪个值分配给LOGFONT结构的lfQuality成员。

这是相关代码:


//LOGFONT struct
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public class LOGFONT
    {
        public const int LF_FACESIZE = 32;
        public int lfHeight;
        public int lfWidth;
        public int lfEscapement;
        public int lfOrientation;
        public int lfWeight;
        public byte lfItalic;
        public byte lfUnderline;
        public byte lfStrikeOut;
        public byte lfCharSet;
        public byte lfOutPrecision;
        public byte lfClipPrecision;
        public byte lfQuality;
        public byte lfPitchAndFamily;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = LF_FACESIZE)]
        public string lfFaceName;
    }
然后导入CreateFontIndirect:

[DllImport("gdi32.dll", CharSet=CharSet.Auto)]
        public static extern IntPtr CreateFontIndirect(
            [In, MarshalAs(UnmanagedType.LPStruct)]
            LOGFONT lplf   // characteristics
            );
现在创建字体:

LOGFONT lf = new LOGFONT();
lf.lfFaceName = "DejaVu Sans";
lf.lfHeight = 36;
lf.lfQuality = 5;
IntPtr handle = CreateFontIndirect(lf);

Font f = Font.FromLogFont(lf);

所以托管代码似乎忽略了lfQuality成员。任何方式修复?我想控制一些字体的呈现方式,忽略系统的全局设置。

2 个答案:

答案 0 :(得分:1)

由于您使用的是CLEARTYPE_QUALITY(5),因此您可能依赖于Windows系统ClearType设置。

请参阅此http://support.microsoft.com/kb/306527和此http://www.howtogeek.com/howto/windows-vista/why-do-my-windows-vista-fonts-look-horrible/

答案 1 :(得分:0)

尝试使用不同的字体。并非所有字体都支持所有质量模式。

问题不应该与托管代码有关,因为您直接调用底层API。 (除非托管的FromLogFont调用正在改变事情。我想这是可能的,虽然它让我感到惊讶。)