The Mask
The Mask

Reputation: 17427

reading windows font

What is the best way to read all windows fonts into ComboBox? Basically, I'm tried do this:

equal to the Microsoft Word

I can do:

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

and show each file into ComboBox, but this is correct? Have not an component that do this work?

Thanks in advance.

Upvotes: 7

Views: 1962

Answers (4)

Ghasem
Ghasem

Reputation: 15573

You can create a custom control which automatically loads windows installed fonts:

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;
        }       

    }

}

Upvotes: 0

tenfour
tenfour

Reputation: 36896

Look at EnumFontFamiliesEx and EnumFonts.

Much better is InstalledFontCollection. I didn't realize it existed.

Upvotes: 7

LarsTech
LarsTech

Reputation: 81620

Try this:

using System.Drawing.Text;

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

Upvotes: 5

ncite
ncite

Reputation: 563

There are some .FON fonts in Font folder. C# does not work those BITMAP font -- you can not display those fonts using drawstring function. To get all fonts you can show, simply use this code I found from here: 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);
          }
        }
      }

Upvotes: 4

Related Questions