2011-10-26 89 views
7

什麼是讀取所有窗口字體到組合框? 基本上,我試着這樣做:閱讀窗口字體

等於的Microsoft Word

我可以這樣做:

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

,並顯示每個文件到組合框,但這是正確?沒有這樣做的組件?

在此先感謝。

回答

5

試試這個:

using System.Drawing.Text; 

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

有在字體文件夾中的一些.FON字體。 C#不能處理那些BITMAP字體 - 你不能使用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); 
      } 
     } 
     } 
0

您可以創建一個自動加載的窗戶安裝的字體自定義控制:

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

    } 

}