阅读windows字体

时间:2011-10-26 01:14:24

标签: c# .net windows fonts filesystems

将所有Windows字体读入 ComboBox 的最佳方法是什么? 基本上,我试过这样做:

等于 Microsoft Word

我能做到:

 string[] fonts = Directory.GetFiles(@"C:\windows\fonts");

并将每个文件显示到 ComboBox 中,但这是正确的吗?有没有这样做的组件?

提前致谢。

4 个答案:

答案 0 :(得分:7)

查看EnumFontFamiliesExEnumFonts

好多了InstalledFontCollection。我没有意识到它存在。

答案 1 :(得分:5)

试试这个:

using System.Drawing.Text;

InstalledFontCollection myFonts = new InstalledFontCollection();
foreach (FontFamily ff in myFonts.Families)
  comboBox1.Items.Add(ff.Name);
}

答案 2 :(得分:4)

Font文件夹中有一些.FON字体。 C#不适用于那些BITMAP字体 - 您无法使用抽象字符串函数显示这些字体。要获取您可以显示的所有字体,只需使用我在此处找到的代码: http://www.java2s.com/Code/CSharp/GUI-Windows-Form/Getallsysteminstalledfont.htm

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


   public class Test{
        static void Main() 
        {
          InstalledFontCollection fonts = new InstalledFontCollection();
          for(int i = 0; i < fonts.Families.Length; i++)
          {
            Console.WriteLine(fonts.Families[i].Name);
          }
        }
      }

答案 3 :(得分:0)

您可以创建自动加载Windows已安装字体的自定义控件:

namespace MyProject
{   
    public class FontComboBox : ComboBox
    {
        public FontComboBox()
        {               
            MaxDropDownItems = 20;
            IntegralHeight = false;
            Sorted = false;
            DropDownStyle = ComboBoxStyle.DropDownList;
            DrawMode = DrawMode.OwnerDrawVariable;                          
        }

        public void Populate(bool b)
        {
            both = b;
            foreach (FontFamily ff in FontFamily.Families)
            {
                if(ff.IsStyleAvailable(FontStyle.Regular))
                    Items.Add(ff.Name);                                             
            }           

            if(Items.Count > 0)
                SelectedIndex=0;
            //ttimg = new Bitmap(GetType(),"ttfbmp.bmp");
            ttimg = new Bitmap(Resources.ttfbmp);
        }

        protected override void OnMeasureItem(System.Windows.Forms.MeasureItemEventArgs e)
        {   
            if(e.Index > -1)
            {
                int w = 0;
                string fontstring = Items[e.Index].ToString();                      
                Graphics g = CreateGraphics();
                e.ItemHeight = (int)g.MeasureString(fontstring, new Font(fontstring,10)).Height;
                w = (int)g.MeasureString(fontstring, new Font(fontstring,10)).Width;
                if(both)
                {
                    int h1 = (int)g.MeasureString(samplestr, new Font(fontstring,10)).Height;
                    int h2 = (int)g.MeasureString(Items[e.Index].ToString(), new Font("Arial",10)).Height;
                    int w1 = (int)g.MeasureString(samplestr, new Font(fontstring,10)).Width;
                    int w2 = (int)g.MeasureString(Items[e.Index].ToString(), new Font("Arial",10)).Width;
                    if(h1 > h2 )
                        h2 = h1;
                    e.ItemHeight = h2;
                    w = w1 + w2;
                }
                w += ttimg.Width*2;
                if(w > maxwid)
                    maxwid=w;
                if(e.ItemHeight > 20)
                    e.ItemHeight = 20;
            }



            base.OnMeasureItem(e);
        }

        protected override void OnDrawItem(System.Windows.Forms.DrawItemEventArgs e)
        {   
            if(e.Index > -1)
            {
                string fontstring = Items[e.Index].ToString();
                nfont = new Font(fontstring,10);
                Font afont = new Font("Arial",10);

                if(both)
                {
                    Graphics g = CreateGraphics();
                    int w = (int)g.MeasureString(fontstring, afont).Width;

                    if((e.State & DrawItemState.Focus)==0)
                    {
                        e.Graphics.FillRectangle(new SolidBrush(SystemColors.Window),
                            e.Bounds.X+ttimg.Width,e.Bounds.Y,e.Bounds.Width,e.Bounds.Height);
                        e.Graphics.DrawString(fontstring,afont,new SolidBrush(SystemColors.WindowText),
                            e.Bounds.X+ttimg.Width*2,e.Bounds.Y);   
                        e.Graphics.DrawString(samplestr,nfont,new SolidBrush(SystemColors.WindowText),
                            e.Bounds.X+w+ttimg.Width*2,e.Bounds.Y); 
                    }
                    else
                    {
                        e.Graphics.FillRectangle(new SolidBrush(SystemColors.Highlight),
                            e.Bounds.X+ttimg.Width,e.Bounds.Y,e.Bounds.Width,e.Bounds.Height);
                        e.Graphics.DrawString(fontstring,afont,new SolidBrush(SystemColors.HighlightText),
                            e.Bounds.X+ttimg.Width*2,e.Bounds.Y);
                        e.Graphics.DrawString(samplestr,nfont,new SolidBrush(SystemColors.HighlightText),
                            e.Bounds.X+w+ttimg.Width*2,e.Bounds.Y);
                    }   
                }
                else
                {

                    if((e.State & DrawItemState.Focus)==0)
                    {
                        e.Graphics.FillRectangle(new SolidBrush(SystemColors.Window),
                            e.Bounds.X+ttimg.Width,e.Bounds.Y,e.Bounds.Width,e.Bounds.Height);
                        e.Graphics.DrawString(fontstring,nfont,new SolidBrush(SystemColors.WindowText),
                            e.Bounds.X+ttimg.Width*2,e.Bounds.Y);

                    }
                    else
                    {
                        e.Graphics.FillRectangle(new SolidBrush(SystemColors.Highlight),
                            e.Bounds.X+ttimg.Width,e.Bounds.Y,e.Bounds.Width,e.Bounds.Height);
                        e.Graphics.DrawString(fontstring,nfont,new SolidBrush(SystemColors.HighlightText),
                            e.Bounds.X+ttimg.Width*2,e.Bounds.Y);
                    }           

                }

                e.Graphics.DrawImage(ttimg, new Point(e.Bounds.X, e.Bounds.Y)); 
            }
            base.OnDrawItem(e);
        }

        Font nfont;
        bool both = false;
        int maxwid = 0;
        string samplestr = " - " + Resources.AppTitle;
        Image ttimg;

        protected override void OnDropDown(System.EventArgs e)
        {
            this.DropDownWidth = maxwid+30;
        }       

    }

}