чтение шрифта Windows

#c# #.net #windows #fonts #filesystems

#c# #.net #Windows #шрифты #файловые системы

Вопрос:

Каков наилучший способ чтения всех шрифтов Windows в поле со списком? В принципе, я пытался сделать это:

равно Microsoft Word

Я могу сделать:

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

и показывать каждый файл в поле со списком, но это правильно? У вас нет компонента, который выполняет эту работу?

Заранее спасибо.

Ответ №1:

Посмотрите на EnumFontFamiliesEx и EnumFonts .

Намного лучше InstalledFontCollection . Я не знал, что он существует.

Ответ №2:

Попробуйте это:

 using System.Drawing.Text;

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

Комментарии:

1. InstalledFontCollection есть IDisposable . Перенесите использование в using оператор and.

Ответ №3:

Есть некоторые .Найдите шрифты в папке шрифтов. C # не использует эти растровые шрифты — вы не можете отображать эти шрифты с помощью функции drawstring. Чтобы получить все шрифты, которые вы можете отобразить, просто используйте этот код, который я нашел здесь: 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);
          }
        }
      }
  

Ответ №4:

Вы можете создать пользовательский элемент управления, который автоматически загружает шрифты, установленные в 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 amp; 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 amp; 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;
        }       

    }

}