检索选定的FontFamily的每个字符

时间:2018-08-23 14:56:37

标签: c# winforms fonts

我正在尝试创建一个控件,该控件允许用户选择字体系列,然后从该字体系列中选择字符。以下是我要实现的示例。

enter image description here

用字体系列列表填充组合框很容易:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\WPF\System.Windows.Controls.Ribbon.dll

但是如何遍历并检索给定字体系列中的每个特定字符?

我将在“ DataGridViewButtonCell”上显示每个字符。

2 个答案:

答案 0 :(得分:2)

DataGridViewButtonCell的属性为Style.Font.FontFamily
这是使用DataGridViewButtonCell的完整示例:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        LoadDgv();

        // detect each button font family
        for (int i = 0; i < dataGridView1.RowCount-1; i++)
        {
            Debug.WriteLine(dataGridView1.Rows[i].Cells["button"].Style.Font.FontFamily.ToString());
        }
    }

    private void LoadDgv()
    {
        dataGridView1.Columns.Add("btns", "BTNS");
        FontFamilyCB.DisplayMember = "Name";
        DataGridViewButtonColumn button = new DataGridViewButtonColumn();
        {
            button.Name = "button";
            button.HeaderText = "Button";
            button.Text = "Button";
            dataGridView1.Columns.Add(button);
        }
        foreach (System.Drawing.FontFamily font in System.Drawing.FontFamily.Families)
        {
            FontFamilyCB.Items.Add(font);

            DataGridViewButtonCell b = new DataGridViewButtonCell();

            int rowIndex = dataGridView1.Rows.Add(b);
            dataGridView1.Rows[rowIndex].Cells["button"].Style.Font = new Font(font, 11, FontStyle.Regular);
            // each cell will have his own font-family
            dataGridView1.Rows[rowIndex].Cells["button"].Value = "A";
        }
    }
}

答案 1 :(得分:2)

这是一个如何通过将int强制转换为char来显示字符的示例。如果我们在循环中进行此操作(并进行足够的迭代),则最终将显示所有字符。不幸的是,我认为有超过100,000个Unicode字符,这可能比您要显示的字符还要多(而且并非所有字符都会为每种字体显示内容)。

我将由您自己决定要显示的内容,但这是一个示例,该示例以按钮网格的形式打印出其中的前3750个(75 x 50)。 *请注意,您添加的控件越多,加载时间就越慢。

只需创建一个新的WinForms项目并将此代码放入Form_Load事件中即可。您可以使用定义的变量来调整网格大小(从而调整加载时间):

private void Form1_Load(object sender, EventArgs e)
{
    int gridWidth = 75;
    int gridHeight = 50;
    int controlSize = 20;

    int row = 0;

    for (int i = 1; i < gridWidth * gridHeight; i++)
    {
        var value = ((char) i).ToString();

        Controls.Add(new Button
        {
            Left = i % gridWidth * controlSize,
            Top = row * controlSize,
            Width = controlSize,
            Height = controlSize,
            Text = value
        });

        if (i % gridWidth == 0) row++;
    }
}

输出

enter image description here