以所有可用字体绘制文本

时间:2015-06-22 13:32:19

标签: c# fonts

我有简单的ListBox,我想在所有可用的字体中绘制简单的text,以便选择我喜欢的字体:

ListBox lb;
foreach (FontFamily font in System.Drawing.FontFamily.Families)
{
    Font f = new Font(font, 15);
    lbFonts.Items.Add(f.Name + ": " + "11");
}

目前我的ListBox都使用相同的字体。

2 个答案:

答案 0 :(得分:1)

您可以简单地将Font本身添加到列表中(或创建一个类,为字体和大小添加属性并覆盖ToString() - 方法ti获取样本中的文本)。

这样您就可以使用方法used here

为初始化添加以下行:

this.listBox1.DrawMode = DrawMode.OwnerDrawFixed;
this.listBox1.DrawItem += new System.Windows.Forms.DrawItemEventHandler(listBox1_DrawItem);

listBox1.ItemHeight = 20;
InstalledFontCollection installedFontCollection = new InstalledFontCollection();

foreach (FontFamily fontFamily in installedFontCollection.Families)
{
    FontListItem item = new FontListItem(fontFamily, 10);
    listBox1.Items.Add(item);
}

DrawItem-Method:

void listBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    e.DrawBackground();

    FontListItem item = (FontListItem)listBox1.Items[e.Index];

    e.Graphics.DrawString(item.ToString(), item.Font, Brushes.Black, e.Bounds, StringFormat.GenericDefault);
}

将Font添加到ListBox的示例类:

private class FontListItem
{
    public int Size { get; private set; }
    public Font Font { get; private set; }

    public FontListItem(FontFamily family, int size)
    {
        Font = new Font(family, size);
        Size = size;
    }

    public override string ToString()
    {
        if(Font != null)
            return Font.Name + ": " + Size;
        return "[none]: " + Size;
    }
}

您应该得到类似于此的输出:

Sample output with listbox

答案 1 :(得分:0)

我相信你真正的问题是:

  

如何枚举.NET中所有已安装的字体?

Microsoft has written a How-To。它的核心是使用InstalledFontCollection来获取所有字体系列:

InstalledFontCollection installedFontCollection = new InstalledFontCollection();

// Get the array of FontFamily objects.
FontFamily[] fontFamilies = installedFontCollection.Families;

重复此操作以填充列表框。请注意,从UI的角度来看,这是一种可怕的方法,没有某种形式。此外,许多用户喜欢看到该字体的样本,但是使用字体的名称作为样本会损害UI,因为有许多象形字体(Zapf Dingbats,Wingdings等)可以'以有用的方式呈现自己的名字。