2011-12-27 8 views
8

Ponieważ wbudowane okno dialogowe czcionek zwraca wyjątek "Nie jest to typowa czcionka" po wybraniu czcionki Non True Type, próbuję utworzyć niestandardową czcionkę Okno dialogowe Czcionka za pomocą rodzin czcionek, które odfiltrowują niepoprawne czcionki czcionek.Projektowanie niestandardowego okna dialogowego/selektora czcionek dla języka C#, który odfiltrowuje czcionki niepoprawne typu

Sterowanie działa idealnie, ale potrzebuję selektorów rozmiaru i stylu dla tego okna dialogowego. Publikuję bieżący kod. Pomóż mi dodać rozmiar i selektor stylu do tego. Może ci się przydać.

public class FontListBox : ListBox 
{ 
    private List<Font> _fonts = new List<Font>(); 
    private Brush _foreBrush; 

    public FontListBox() 
    { 
     DrawMode = DrawMode.OwnerDrawFixed; 
     ItemHeight = 20; 
     foreach (FontFamily ff in FontFamily.Families) 
     { 
      // determine the first available style, as all fonts don't support all styles 
      FontStyle? availableStyle = null; 
      foreach (FontStyle style in Enum.GetValues(typeof(FontStyle))) 
      { 
       if (ff.IsStyleAvailable(style)) 
       { 
        availableStyle = style; 
        break; 
       } 
      } 

      if (availableStyle.HasValue) 
      { 
       Font font = null; 
       try 
       { 
        // do your own Font initialization here 
        // discard the one you don't like :-) 
        font = new Font(ff, 12, availableStyle.Value); 
       } 
       catch 
       { 
       } 
       if (font != null) 
       { 
        _fonts.Add(font); 
        Items.Add(font); 
       } 
      } 
     } 
    } 

    protected override void Dispose(bool disposing) 
    { 
     base.Dispose(disposing); 
     if (_fonts != null) 
     { 
      foreach (Font font in _fonts) 
      { 
       font.Dispose(); 
      } 
      _fonts = null; 
     } 
     if (_foreBrush != null) 
     { 
      _foreBrush.Dispose(); 
      _foreBrush = null; 
     } 
    } 

    public override Color ForeColor 
    { 
     get 
     { 
      return base.ForeColor; 
     } 
     set 
     { 
      base.ForeColor = value; 
      if (_foreBrush != null) 
      { 
       _foreBrush.Dispose(); 
      } 
      _foreBrush = null; 
     } 
    } 

    private Brush ForeBrush 
    { 
     get 
     { 
      if (_foreBrush == null) 
      { 
       _foreBrush = new SolidBrush(ForeColor); 
      } 
      return _foreBrush; 
     } 
    } 

    protected override void OnDrawItem(DrawItemEventArgs e) 
    { 
     base.OnDrawItem(e); 
     if (e.Index < 0) 
      return; 

     e.DrawBackground(); 
     e.DrawFocusRectangle(); 
     Rectangle bounds = e.Bounds; 
     Font font = (Font)Items[e.Index]; 
     e.Graphics.DrawString(font.Name, font, ForeBrush, bounds.Left, bounds.Top); 
    } 
} 

public partial class MyFontDialog : Form 
{ 
    private FontListBox _fontListBox; 

    public MyFontDialog() 
    { 
     InitializeComponent(); 

     _fontListBox = new FontListBox(); 
     _fontListBox.Dock = DockStyle.Fill; 
     Controls.Add(_fontListBox); 
    } 
} 

mam gospodarzem projektu na SourceForge https://sourceforge.net/p/newfontpicker/

+0

Klasa FontDialog już filtruje czcionki inne niż TrueType. Prawdziwym rozwiązaniem jest odinstalowanie czcionki, która ma złe metadane. –

+0

No.Patrz http://c-madeeasy.blogspot.com/2011/11/unsolved-this-is-not-true-type-font.html – techno

+0

Próbuje odfiltrować te czcionki opentype, ale niektóre czcionki nadal istnieją .Zobacz http://connect.microsoft.com/VisualStudio/feedback/details/708872/this-is-not-a-true-type-font-only-true-type-fonts-are-accepted-exception – techno

Odpowiedz

1

Można modyfikować MyFontDialog tak:

public partial class MyFontDialog : Form 
{ 
    private FontListBox _fontListBox; 
    private ListBox _fontSizeListBox; 

    public MyFontDialog() 
    { 
     //InitializeComponent(); 

     _fontListBox = new FontListBox(); 
     _fontListBox.SelectedIndexChanged += OnfontListBoxSelectedIndexChanged; 
     _fontListBox.Size = new Size(200, Height); 
     Controls.Add(_fontListBox); 

     _fontSizeListBox = new ListBox(); 
     _fontSizeListBox.Location = new Point(_fontListBox.Width, 0); 

     Controls.Add(_fontSizeListBox); 
    } 

    private void OnfontListBoxSelectedIndexChanged(object sender, EventArgs e) 
    { 
     _fontSizeListBox.Items.Clear(); 
     Font font = _fontListBox.SelectedItem as Font; 
     if (font != null) 
     { 
      foreach (FontStyle style in Enum.GetValues(typeof(FontStyle))) 
      { 
       if (font.FontFamily.IsStyleAvailable(style)) 
       { 
        _fontSizeListBox.Items.Add(style); 
       } 
      } 
     } 
    } 
} 

To stworzy pole listy bok pola listy czcionki z listy dostępnych stylów czcionek. Jeśli chodzi o wybór rozmiaru, można po prostu dodać pole listy z zakodowaną listą rozmiarów: 8,9,10,11,12, 14,16,18,20,22,22, 26,28,36,48 i 72 , podobnie jak standardowy FontDialog, ponieważ mamy do czynienia z czcionkami prawdziwego typu.

0

http://www.developerfusion.com/code/254/determine-if-a-font-is-truetype/ ma jakiś kod VB do ustalenia, czy czcionka jest czcionką TT. Wszystko, co naprawdę robi, to wywoływanie funkcji Win32 API i analizowanie wyników.

Może istnieć kilka czcionek, które wydają się być TT, ale nie są, nawet jeśli są badane za pomocą Win32 API (które prawdopodobnie robi FontDialog). Jeśli Win32 nie rozwiąże problemu, prawdopodobnie jedynym sposobem sprawdzenia, czy czcionka jest nieprawidłowa, jest sprawdzenie wyjątku.

0

OK, Umar, Należy starać:

1) Korzystanie z „FontFamily.IsStyleAvailable”, aby uniknąć/zminimalizować konieczność nadrabiania wyjątkami - a więc przegapić jakiegoś dostępnych czcionek. 2) grać trochę z Graphics.MeasureString aby ustawić rozmiar czcionki dla każdego, który wygląda najlepiej i będzie Ci kolumn równej wysokości ...

okazji próbuje :)

Jens, Dania.

Powiązane problemy