【问题标题】:Retrieving each character of a selected FontFamily检索选定 FontFamily 的每个字符
【发布时间】:2018-08-23 14:56:36
【问题描述】:

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

使用字体系列列表填充组合框非常简单:

FontFamilyCB.DisplayMember = "Name";
foreach (System.Drawing.FontFamily font in System.Drawing.FontFamily.Families)
{
    FontFamilyCB.Items.Add(font);
}

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

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

【问题讨论】:

  • 这并不难,(例如,cast byte to char 用于单字节字体)但过滤掉那些在代码点没有字形的字体更具挑战性..

标签: c# winforms fonts


【解决方案1】:

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

我会让您自己决定您真正想要显示哪些按钮,但这里有一个示例,可以在按钮网格中打印出前 3,750 (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++;
    }
}

输出

【讨论】:

  • 谢谢!这让我最接近我想要做的事情。
【解决方案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";
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    相关资源
    最近更新 更多