using System; using System.Drawing; using System.Runtime.InteropServices; using System.Text; using System.Xml; using System.Xml.Schema; using System.Xml.Serialization; namespace GeoSigmaDrawLib { [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Auto)] public struct LogFont : IXmlSerializable { [XmlAttribute("H")] public int lfHeight { get; set; } [XmlAttribute("W")] public int lfWidth { get; set; } [XmlIgnore] public int lfEscapement { get; set; } [XmlAttribute("O")] public int lfOrientation { get; set; } [XmlAttribute("B")] public int lfWeight; // [XmlAttribute("B")] // public bool lfBold; [XmlAttribute("I")] [MarshalAs(UnmanagedType.U1)] public bool lfItalic; [XmlAttribute("U")] [MarshalAs(UnmanagedType.U1)] public bool lfUnderline; [XmlAttribute("S")] [MarshalAs(UnmanagedType.U1)] public bool lfStrikeOut; [XmlAttribute("CS")] public byte lfCharSet; [XmlAttribute("OP")] public byte lfOutPrecision; [XmlAttribute("CP")] public byte lfClipPrecision; [XmlAttribute("Q")] public byte lfQuality; [XmlAttribute("PF")] public byte lfPitchAndFamily; [XmlAttribute("FN")] [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] public string lfFaceName; public override string ToString() { StringBuilder sb = new StringBuilder(); sb.Append("LOGFONT\n"); sb.AppendFormat(" lfHeight: {0}\n", lfHeight); sb.AppendFormat(" lfWidth: {0}\n", lfWidth); sb.AppendFormat(" lfEscapement: {0}\n", lfEscapement); sb.AppendFormat(" lfOrientation: {0}\n", lfOrientation); sb.AppendFormat(" lfWeight: {0}\n", lfWeight); // sb.AppendFormat(" lfBold: {0}\n", lfBold); sb.AppendFormat(" lfItalic: {0}\n", lfItalic ? 1 : 0); sb.AppendFormat(" lfUnderline: {0}\n", lfUnderline); sb.AppendFormat(" lfStrikeOut: {0}\n", lfStrikeOut); sb.AppendFormat(" lfCharSet: {0}\n", lfCharSet); sb.AppendFormat(" lfOutPrecision: {0}\n", lfOutPrecision); sb.AppendFormat(" lfClipPrecision: {0}\n", lfClipPrecision); sb.AppendFormat(" lfQuality: {0}\n", lfQuality); sb.AppendFormat(" lfPitchAndFamily: {0}\n", lfPitchAndFamily); sb.AppendFormat(" lfFaceName: {0}\n", lfFaceName); return sb.ToString(); } /// /// 转换为PCG /// /// public string ToPcgString() { return string.Format( @"B=""{0}"" I=""{1}"" U=""{2}"" S=""{3}"" CS=""{4}"" OP=""{5}"" CP=""{6}"" Q=""{7}"" PF=""{8}"" FN=""{9}"" H=""{10}"" W=""{11}"" O=""{12}""", lfWeight, lfItalic ? 1 : 0, lfUnderline ? 1 : 0, lfStrikeOut ? 1 : 0, lfCharSet, lfOutPrecision, lfClipPrecision, lfQuality, lfPitchAndFamily, lfFaceName, lfHeight, lfWidth, lfOrientation); } [DllImport("gdi32", EntryPoint = "CreateFontW", CharSet = CharSet.Auto)] static extern IntPtr CreateFontW( [In] Int32 nHeight, [In] Int32 nWidth, [In] Int32 nEscapement, [In] Int32 nOrientation, [In] FontWeight fnWeight, [In] Boolean fdwItalic, [In] Boolean fdwUnderline, [In] Boolean fdwStrikeOut, [In] FontCharSet fdwCharSet, [In] FontPrecision fdwOutputPrecision, [In] FontClipPrecision fdwClipPrecision, [In] FontQuality fdwQuality, [In] FontPitchAndFamily fdwPitchAndFamily, [In] String lpszFace); /// public XmlSchema GetSchema() { return null; } /// public void ReadXml(XmlReader reader) { reader.MoveToFirstAttribute(); int nIntValue = 0; byte bByteValue = 0; while (reader.MoveToNextAttribute()) { if (reader.Name.Equals("H")) { if (int.TryParse(reader.Value, out nIntValue)) { lfHeight = nIntValue; } } else if(reader.Name.Equals("W")) { if (int.TryParse(reader.Value, out nIntValue)) { lfWidth = nIntValue; } } else if (reader.Name.Equals("O")) { if (int.TryParse(reader.Value, out nIntValue)) { lfOrientation = nIntValue; } } else if (reader.Name.Equals("B")) { if (int.TryParse(reader.Value, out nIntValue)) { lfWeight = nIntValue; } } else if (reader.Name.Equals("I")) { if (int.TryParse(reader.Value, out nIntValue)) { lfItalic = nIntValue == 1 ? true : false; } } else if (reader.Name.Equals("U")) { if (int.TryParse(reader.Value, out nIntValue)) { lfUnderline = nIntValue == 1 ? true : false; } } else if (reader.Name.Equals("S")) { if (int.TryParse(reader.Value, out nIntValue)) { lfStrikeOut = nIntValue == 1 ? true : false; } } else if (reader.Name.Equals("CS")) { if (byte.TryParse(reader.Value, out bByteValue)) { lfCharSet = bByteValue; } } else if (reader.Name.Equals("OP")) { if (byte.TryParse(reader.Value, out bByteValue)) { lfOutPrecision = bByteValue; } } else if (reader.Name.Equals("CP")) { if (byte.TryParse(reader.Value, out bByteValue)) { lfClipPrecision = bByteValue; } } else if (reader.Name.Equals("Q")) { if (byte.TryParse(reader.Value, out bByteValue)) { lfQuality = bByteValue; } } else if (reader.Name.Equals("PF")) { if (byte.TryParse(reader.Value, out bByteValue)) { lfPitchAndFamily = bByteValue; } } else if (reader.Name.Equals("FN")) { lfFaceName = reader.Value; } } } /// public void WriteXml(XmlWriter writer) { writer.WriteAttributeString("B", $"{lfWeight}"); writer.WriteAttributeString("I", (lfItalic ? 1 : 0).ToString()); writer.WriteAttributeString("U", (lfUnderline ? 1 : 0).ToString()); writer.WriteAttributeString("S", (lfStrikeOut ? 1 : 0).ToString()); writer.WriteAttributeString("CS", $"{lfCharSet}"); writer.WriteAttributeString("OP", $"{lfOutPrecision}"); writer.WriteAttributeString("CP", $"{lfClipPrecision}"); writer.WriteAttributeString("Q", $"{lfQuality}"); writer.WriteAttributeString("PF", $"{lfPitchAndFamily}"); writer.WriteAttributeString("FN", $"{lfFaceName}"); writer.WriteAttributeString("H", $"{lfHeight}"); writer.WriteAttributeString("W", $"{lfWidth}"); writer.WriteAttributeString("O", $"{lfOrientation}"); } public static LogFont Default { get; private set; } = LogFontConverter.convert(new Font("Times New Roman", 8)); } public enum FontWeight : int { FW_DONTCARE = 0, FW_THIN = 100, FW_EXTRALIGHT = 200, FW_LIGHT = 300, FW_NORMAL = 400, FW_MEDIUM = 500, FW_SEMIBOLD = 600, FW_BOLD = 700, FW_EXTRABOLD = 800, FW_HEAVY = 900, } public enum FontCharSet : byte { ANSI_CHARSET = 0, DEFAULT_CHARSET = 1, SYMBOL_CHARSET = 2, SHIFTJIS_CHARSET = 128, HANGEUL_CHARSET = 129, HANGUL_CHARSET = 129, GB2312_CHARSET = 134, CHINESEBIG5_CHARSET = 136, OEM_CHARSET = 255, JOHAB_CHARSET = 130, HEBREW_CHARSET = 177, ARABIC_CHARSET = 178, GREEK_CHARSET = 161, TURKISH_CHARSET = 162, VIETNAMESE_CHARSET = 163, THAI_CHARSET = 222, EASTEUROPE_CHARSET = 238, RUSSIAN_CHARSET = 204, MAC_CHARSET = 77, BALTIC_CHARSET = 186, } public enum FontPrecision : byte { OUT_DEFAULT_PRECIS = 0, OUT_STRING_PRECIS = 1, OUT_CHARACTER_PRECIS = 2, OUT_STROKE_PRECIS = 3, OUT_TT_PRECIS = 4, OUT_DEVICE_PRECIS = 5, OUT_RASTER_PRECIS = 6, OUT_TT_ONLY_PRECIS = 7, OUT_OUTLINE_PRECIS = 8, OUT_SCREEN_OUTLINE_PRECIS = 9, OUT_PS_ONLY_PRECIS = 10, } public enum FontClipPrecision : byte { CLIP_DEFAULT_PRECIS = 0, CLIP_CHARACTER_PRECIS = 1, CLIP_STROKE_PRECIS = 2, CLIP_MASK = 0xf, CLIP_LH_ANGLES = (1<<4), CLIP_TT_ALWAYS = (2<<4), CLIP_DFA_DISABLE = (4<<4), CLIP_EMBEDDED = (8<<4), } public enum FontQuality : byte { DEFAULT_QUALITY = 0, DRAFT_QUALITY = 1, PROOF_QUALITY = 2, NONANTIALIASED_QUALITY = 3, ANTIALIASED_QUALITY = 4, CLEARTYPE_QUALITY = 5, CLEARTYPE_NATURAL_QUALITY = 6, } [Flags] public enum FontPitchAndFamily : byte { DEFAULT_PITCH = 0, FIXED_PITCH = 1, VARIABLE_PITCH = 2, FF_DONTCARE = (0<<4), FF_ROMAN = (1<<4), FF_SWISS = (2<<4), FF_MODERN = (3<<4), FF_SCRIPT = (4<<4), FF_DECORATIVE = (5<<4), } public class LogFontConverter { public static LogFont convert(Font font) { LogFont logFont = new LogFont(); logFont.lfCharSet = font.GdiCharSet; logFont.lfHeight = font.Height; logFont.lfItalic = font.Italic; logFont.lfUnderline = font.Underline; logFont.lfStrikeOut = font.Strikeout; logFont.lfFaceName = font.Name; logFont.lfWeight = font.Bold ? 800 : 0; return logFont; } } //[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] //public class LogFont //{ // [XmlAttribute("W")] // public int W; // [XmlAttribute("H")] // public int H; // [XmlAttribute("O")] // public int Orientation; // [XmlAttribute("B")] // public int Weight; // [XmlAttribute("I")] // public bool I; // [XmlAttribute("U")] // public bool U; // [XmlAttribute("S")] // public bool StrikeOut; // [XmlAttribute("CS")] // public int CharSet; // [XmlAttribute("OP")] // public int OP; // [XmlAttribute("CP")] // public int CP; // [XmlAttribute("Q")] // public bool Q; // [XmlAttribute("PF")] // public int PF; // [XmlAttribute("FN")] // public string FN; // str.Format("", //lf.lfWidth, lf.lfHeight, lf.lfOrientation, lf.lfWeight, //lf.lfItalic, lf.lfUnderline, lf.lfStrikeOut, lf.lfCharSet, //lf.lfOutPrecision, lf.lfClipPrecision, lf.lfQuality, lf.lfPitchAndFamily, //lf.lfFaceName); //W="7" H="14" O="0" B="400" I="0" U="0" S="0" CS="1" OP="0" CP="16" Q="0" PF="0" FN="Times New Roman" //} }