2011-10-26 27 views
7

Cách tốt nhất để đọc tất cả phông chữ cửa sổ thành ComboBox là gì? Về cơ bản, tôi đang cố gắng làm điều này:đọc cửa sổ phông chữ

bằng với Microsoft Word

tôi có thể làm:

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

và hiển thị từng tập tin vào ComboBox, nhưng đây là chính xác? Không phải là một thành phần làm công việc này?

Xin cảm ơn trước.

Trả lời

5

Hãy thử điều này:

using System.Drawing.Text; 

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

Nhìn vào EnumFontFamiliesExEnumFonts.

Tốt hơn nhiều là InstalledFontCollection. Tôi không nhận ra nó tồn tại.

+0

Một phương pháp tốt để sử dụng trong C++. Cảm ơn. – Jack

4

Có một số phông chữ .FON trong thư mục Font. C# không làm việc những font BITMAP - bạn không thể hiển thị những phông chữ bằng cách sử dụng chức năng drawstring. Để có được tất cả các phông chữ bạn có thể hiển thị, bạn chỉ cần sử dụng mã này tôi thấy từ đây: 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

Bạn có thể tạo một điều khiển tùy chỉnh mà sẽ tự động tải các cửa sổ phông chữ được cài đặt:

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

    } 

} 
Các vấn đề liên quan