Фильтрация / удаление шрифтов не истинного типа из диалога шрифтов в C # - PullRequest
3 голосов
/ 05 ноября 2011

Я использую диалог шрифтов, чтобы выбрать шрифт и создать шрифт из выбранного шрифта, используя

font = new Font(fontDialog1.Font.Name, fontDialog1.Font.Size, FontStyle.Regular, GraphicsUnit.Pixel);

Когда я выбираю шрифт другого типа, я получаю исключение «Это не шрифт TrueType», я знаю, что GDI + поддерживает только TTF. Могу ли я настроить диалог шрифтов, чтобы показать только TTF.

Ответы [ 2 ]

2 голосов
/ 24 ноября 2011

Я не думаю, что есть решение этой проблемы (как указано в многочисленных других статьях в Интернете), но вы можете переписать FontDialog так, как вам нужно.

Для начала,Вот реализация FontListBox, которая отображает список рисования владельца со шрифтами, отображаемыми в нем:

enter image description here

Пример диалогового окна, в котором он находится:

public partial class MyFontDialog : Form
{
    private FontListBox _fontListBox;

    public MyFontDialog()
    {
        InitializeComponent();

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

список:

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);
    }
}
0 голосов
/ 24 ноября 2011

К сожалению, похоже, что GDI + просто не может обрабатывать определенные шрифты.Короче говоря, было два общих масштабируемых стандарта шрифтов: TrueType и PostScript.Они были объединены в OpenType, так что шрифт OpenType может иметь контуры TT, контуры PS или оба.Когда вы просите, чтобы в палитре шрифтов отображались только шрифты TT, включаются шрифты OT, даже те, которые содержат только контуры PS.Это связано с тем, что GDI может отображать их, даже если GDI + не может .

Если вы хотите создать средство выбора шрифтов, которое не отображает эти шрифты, вам придется найти какой-тоопределить, какие шрифты были поддержаны (либо откройте их и проанализируйте в поисках контуров ТТ, попробуйте использовать каждый из них и посмотрите, есть ли у вас исключение, или есть белый список).Тогда вам нужно будет создать диалоговое окно выбора шрифтов, в котором будут отображаться только эти шрифты.

...