8
votes

Concevoir une boîte de dialogue de police / sélecteur personnalisé pour C # qui filtre les polices de type non vraies

Étant donné que la boîte de dialogue de police intégrée renvoie une exception "Pas une vraie police de type" sur la sélection d'une police de type non vraie, j'essaie de créer une boîte de dialogue de police personnalisée à l'aide de Familles de police qui filtrent des polices de type non vraies.

Le contrôle fonctionne parfaitement, mais j'ai besoin d'une taille et de sélecteurs de style pour cette boîte de dialogue. Je pose le code actuel. Aidez-moi s'il vous plaît ajouter une taille et un sélecteur de style à cela. Cela pourrait également être utile pour vous. P>

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


3 commentaires

La classe Fondialog utilise déjà des polices non-TrueType. La vraie solution ici est de désinstaller la police qui a la mauvaise métadonna.


Novoyez-vous voir C- raseseasy.blogspot.com/2011/11/...


Il essaie de filtrer ces polices OpenType, mais certaines polices sont toujours existantes.See Connect.Microsoft.com/visualstudio/feedback/Détails/708872/...


3 Réponses :


0
votes

http://www.developerfusion.com / Code / 254 / Déterminer-if-A-Font-IS-TrueType / a un code VB pour déterminer si une police est une police TT. Tout cela est vraiment appelé certaines fonctions de l'API Win32 et examine les résultats.

Il peut y avoir des polices qui semblent être TT mais ne sont pas, même lorsqu'elles sont examinées avec l'API Win32 (que le Fondialog va probablement quand même). Si Win32 ne résout pas votre problème, alors probablement le seul moyen de savoir si une police est invalide est de vérifier une exception.


0 commentaires

1
votes

Vous pouvez modifier le myfontDialog comme ceci:

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


0 commentaires

0
votes

OK, Umar, Vous devriez essayer:

1) Utilisation de "FontFamily.SstyleVailable" pour éviter / minimiser la nécessité d'attraper des exceptions - et donc manquer sur certaines polices disponibles. 2) Jouez un peu avec des graphismes.Mesurstring pour définir une taille pour chaque police qui semble meilleure et vous obtiendra des colonnes de hauteur égale ...

heureux essayer :)

Jens, Danemark.


0 commentaires