2011-12-27 3 views
8

फ़िल्टर करता है क्योंकि इनबिल्ट फ़ॉन्ट डायलॉग एक गैर ट्रू टाइप फ़ॉन्ट का चयन करने पर 'ट्रू टाइप फ़ॉन्ट नहीं' अपवाद देता है, मैं कस्टम बनाने की कोशिश कर रहा हूं फ़ॉन्ट-परिवार का उपयोग करके फ़ॉन्ट डायलॉग जो गैर-सही प्रकार के फोंट को फ़िल्टर करता है।सी # के लिए कस्टम फ़ॉन्ट संवाद/चयनकर्ता को डिज़ाइन करना जो गैर वास्तविक प्रकार फ़ॉन्ट्स

नियंत्रण पूरी तरह से काम कर रहा है लेकिन मुझे इस संवाद के लिए आकार और शैली चयनकर्ताओं की आवश्यकता है। मैं वर्तमान कोड पोस्ट कर रहा हूँ। कृपया मुझे आकार और स्टाइल चयनकर्ता जोड़ने में मेरी सहायता करें। यह आपके लिए भी उपयोगी हो सकता है।

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

मैं https://sourceforge.net/p/newfontpicker/

+0

फ़ॉन्टडिअलॉग क्लास पहले से ही गैर-ट्रू टाइप फ़ॉन्ट्स फ़िल्टर करता है। यहां वास्तविक समाधान उस फ़ॉन्ट को अनइंस्टॉल करना है जिसमें खराब मेटाडेटा है। –

+0

नं। कृपया देखें http://c-madeeasy.blogspot.com/2011/11/unsolved-this-is-not-true-type-font.html – techno

+0

यह इन opentype फ़ॉन्ट्स को फ़िल्टर करने का प्रयास करता है लेकिन कुछ फ़ॉन्ट अभी भी मौजूद हैं । Http://connect.microsoft.com/VisualStudio/feedback/details/708872/this-is-not-a-true-type-font-only-true-type-fonts-are-accepted-exception देखें। – techno

उत्तर

1

आप इस तरह MyFontDialog को संशोधित कर सकते हैं:

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

यह एक सूची बॉक्स तरफ उपलब्ध फ़ॉन्ट शैली की सूची के साथ फ़ॉन्ट सूची बॉक्स का निर्माण करेगा। आकार की पसंद के लिए, आप बस आकार की हार्डकोडेड सूची के साथ एक सूची बॉक्स जोड़ सकते हैं: 8, 9, 10,11,12, 14,16,18,20,22,24,26,28,36,48 और 72 , मानक FontDialog की तरह, क्योंकि हम सही प्रकार के फ़ॉन्ट्स से निपट रहे हैं।

0

http://www.developerfusion.com/code/254/determine-if-a-font-is-truetype/ निर्धारित करने के लिए एक फ़ॉन्ट एक टीटी फ़ॉन्ट है कुछ VB कोड है sourceforge पर परियोजना की मेजबानी की है। यह वास्तव में कुछ Win32 एपीआई कार्यों को कॉल करता है और परिणामों की जांच करता है।

कुछ फ़ॉन्ट्स हो सकते हैं जो टीटी प्रतीत होते हैं लेकिन Win32 API (जो FontDialog शायद वैसे भी कर रहा है) के साथ जांच की जाती है। यदि Win32 आपकी समस्या को ठीक नहीं करता है, तो शायद यह पता लगाने का एकमात्र तरीका है कि फ़ॉन्ट अमान्य है या नहीं, अपवाद की जांच करना है।

0

ठीक है, उमर, आप प्रयास करना चाहिए:

1) 'FontFamily.IsStyleAvailable' का प्रयोग से बचने के लिए/पकड़ने अपवाद के लिए की जरूरत को कम से कम - और इस तरह कुछ उपलब्ध फ़ॉन्ट्स से न चूकें। 2) Graphics.MeasureString के साथ एक छोटी खेलते हैं कि सबसे अच्छा लग रहा है और आप बराबर ऊंचाई के स्तंभों मिल जाएगा प्रत्येक व्यक्ति फ़ॉन्ट के लिए एक आकार निर्धारित करने के लिए ...

मुबारक की कोशिश कर रहा :)

जेन्स, डेनमार्क।

संबंधित मुद्दे