枚举所有字体的Combobox控件

 

一.引子

    因为一个同事要这个功能的combobox,索性就在网上查了下相关代码,最后借鉴了一些国内国外朋友的方法,把这些字体加载到了Combobox中,并在前面绘制了一些符号.同时,将一些不符合要求的FontStyle样式做了调整,使得全部的string转化为Font时都变的可用.

二.全部源代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Drawing.Text;


namespace JCSControlLibary.JcsFontCombobox
{
    public class FontsAPI
    {
        #region API声明
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        public class LogFont
        {
            public int lfHeight;
            public int lfWidth;
            public int lfEscapement;
            public int lfOrientation;
            public FontWeight lfWeight;
            [MarshalAs(UnmanagedType.U1)]
            public bool lfItalic;
            [MarshalAs(UnmanagedType.U1)]
            public bool lfUnderline;
            [MarshalAs(UnmanagedType.U1)]
            public bool lfStrikeOut;
            public FontCharSet lfCharSet;
            public FontPrecision lfOutPrecision;
            public FontClipPrecision lfClipPrecision;
            public FontQuality lfQuality;
            public FontPitchAndFamily lfPitchAndFamily;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
            public string lfFaceName;
        }
        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 const int LF_FACESIZE = 32;

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        public struct EnumLogFontEx
        {
            public LogFont elfLogFont;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = LF_FACESIZE)]
            public string elfFullName;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = LF_FACESIZE)]
            public string elfStyle;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = LF_FACESIZE)]
            public string elfScript;
        }

        public delegate int EnumFontExDelegate(ref EnumLogFontEx lpelfe, IntPtr lpntme, int FontType, int lParam);

        [DllImport("gdi32.dll", EntryPoint = "EnumFontFamiliesEx", CharSet = CharSet.Unicode)]
        public static extern int EnumFontFamiliesEx(IntPtr hDC, [In, MarshalAs(UnmanagedType.LPStruct)] LogFont logFont, EnumFontExDelegate enumFontExCallback,
            IntPtr lParam, uint dwFlags);

        #endregion
    }
}

 

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Text;

namespace Jcs控件Demo
{
    public partial class JCSFontCombobox : ComboBox
    {
        public JCSFontCombobox()
        {
            InitializeComponent();
            this.DrawMode = DrawMode.OwnerDrawFixed;
            this.DropDownStyle = ComboBoxStyle.DropDownList;
            this.ItemHeight = 21;
            DrawTheItem();
        }
        private List
 
 
  
   list = new List
  
  
   
   ();
       
        private void DrawTheItem()
        {
            this.BeginUpdate();
            this.Items.Clear();
            
            Bitmap bmp = new Bitmap(10, 10);
            Graphics g = Graphics.FromImage(bmp);

            IntPtr hDC = g.GetHdc();
            JCSControlLibary.JcsFontCombobox.FontsAPI.LogFont logFont = new JCSControlLibary.JcsFontCombobox.FontsAPI.LogFont();
            logFont.lfCharSet = JCSControlLibary.JcsFontCombobox.FontsAPI.FontCharSet.DEFAULT_CHARSET;

            int intResult = JCSControlLibary.JcsFontCombobox.FontsAPI.EnumFontFamiliesEx(hDC, logFont, enumFontEx, IntPtr.Zero, 0);
            g.ReleaseHdc(hDC);
            g.Dispose();
            bmp.Dispose();
            if (list.Count > 0)
            {
                list.Sort();
                foreach (string s in list)
                {
                    this.Items.Add(s);
                }
            }
            this.EndUpdate();
        }

        protected override void OnDrawItem(DrawItemEventArgs e)
        {
            base.OnDrawItem(e);
            if (e.Index < 0)
                return;
            Graphics g = e.Graphics;
            Rectangle rect = e.Bounds;
            string drawstr = string.Empty;
            using (SolidBrush b = new SolidBrush(Color.White))
            {
                if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
                {
                    b.Color = SystemColors.HighlightText;
                }
                else
                {
                    b.Color = e.ForeColor;
                }
                //FontFamily item = this.Items[e.Index] as FontFamily;
                string str = this.Items[e.Index] as string;

                FontStyle style = FontStyle.Bold;//注意:获取字体时,使用Regular
               
                if (str == "Monotype Corsiva"
                   || str == "Brush Script MT"
                   || str == "Harlow Solid Italic"
                   || str == "Palace Script MT" ||
                   str == "Vivaldi")
                {
                    style = style | FontStyle.Italic;
                }

                rect.Inflate(-20, 0);

                //if (item.IsStyleAvailable(style))
                e.DrawBackground();

                using (SolidBrush br = new SolidBrush(Color.Blue))
                {
                    if (str.IndexOf('@') == 0)
                    {
                        drawstr = "ab";
                        style = style | FontStyle.Underline;
                        g.DrawString(drawstr, new Font("Arial", 8, style), br, new Rectangle(rect.X - 20, rect.Y, 24, rect.Height -1));
                        //g.DrawString(drawstr, new Font(str, 10, style), br, new Rectangle(rect.X - 12, rect.Y + 3, 16, rect.Height));
                    }
                    else
                    {
                        drawstr ="T";
                        g.DrawString(drawstr, new Font(str, 8, style), br, new Rectangle(rect.X - 20, rect.Y, 20, rect.Height -1));
                        g.DrawString(drawstr, new Font(str, 8, style), br, new Rectangle(rect.X - 16, rect.Y + 3, 20, 17));
                    }
                }
               
                g.DrawString(str, this.Font,b, rect.X, rect.Y);
            }

        }
        int enumFontEx(ref JCSControlLibary.JcsFontCombobox.FontsAPI.EnumLogFontEx lpelfe, IntPtr lpntme, int FontType, int lParam)
        {
            if (list.Contains(lpelfe.elfFullName) == false)
            {
                list.Add(lpelfe.elfFullName);
            }
            return 1;
        }

       
    }
}

   
   

  
  
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值