【问题标题】:Strange FontSize change奇怪的字体大小变化
【发布时间】:2015-12-09 20:00:41
【问题描述】:

我今天遇到了一件奇怪的事情,与合作。

我创建了一个 RichTextBox,默认 FontSize 为 14.25 pt。

我正在执行一些操作,我需要创建临时的RichTextBox,我已经从我的原始RichtextBox 中复制了选定的文本。之后,在我没有做任何更改的情况下,整个 tempRichTextBox 文本的字体大小正好增加了 0.25 pt。每一个字母。是bug还是什么?

using (RichTextBox tempRichTextBox = new RichTextBox())
{
    tempRichTextBox.Rtf = this.richTextBox.SelectedRtf;
    int tempStart = this.richTextBox.SelectionStart;
    int tempLength = this.richTextBox.SelectionLength;
    for (int i = 0; i < tempLength; i++)
    {
        tempRichTextBox.Select(i, 1);
        this.baseSize = tempRichTextBox.SelectionFont.Size;
    }
    tempRichTextBox.Select(0, tempLength);
    this.richTextBox.SelectedRtf = tempRichTextBox.SelectedRtf;
    this.richTextBox.Select(tempStart, tempLength);
}

有人知道为什么会这样吗?

【问题讨论】:

  • 嗯,这不是你能看到的。你怎么知道的?
  • @HansPassant 你这是什么意思?复制后我检查了字体大小。在 14.25 之前是 14.50。
  • 究竟看到了什么?不止一个。 RTB 中文本的字体大小由 SelectionFont 属性提供,但前提是 SelectionStart 位于文本内。
  • 在正文中?好的,如果我只选择了一个字母?就我而言,我已经给出了上面的示例代码?
  • @PawełPoręba,你能找到解决字体大小差异的方法吗?

标签: winforms c# winforms richtextbox


【解决方案1】:

我发现 WinForms 会增加字体大小(或有时会减少)0.25。您在设计器中看到14.25,但它是因为值14 最初存储在那里而实现的。我在单独使用 FontDialog 系统对话框时也看到了这种情况。您选择字体大小 8 并在返回的 Font 对象中找到 8.25。在某些尺寸上,我发现像 14.75 而不是 15 之类的东西。但它并没有随着字体大小而增长,即你会发现字体大小 = 5000 时会有同样的小差异。

原因:字体大小以 0.75 的步长变化。 It is related to DPI and font size units.

因此,在考虑到这一点的情况下实施公式,您应该会开始获得更多可预期的结果。请注意,DPI 或字体大小单位在 FontDialog 和 RTB 的上下文中可能不同。

【讨论】:

  • 我试过这个,但还是一样。但也许为时已晚,我明天再试一次,看看它是否有效:)
  • @PawełPoręba – 如果您找到了解决方案,请告诉我们 :)
  • 嗨:)恐怕我没有。这就是我注意到的:1)如果您只在一个 RTB 中工作,同时以编程方式更改字体大小,则无需舍入它。它将始终具有与预期相同的值。但是如果你使用 FontDialog,值会根据 DPI 改变。 2)如果您将 RTB 的内容复制到另一个,则 FontSize 会在奇怪的条件下发生变化。如果我传递 11.25 的字体大小,它将返回 11.50,但如果我传递 11,它将返回 11!所以和 1) 中的不一样,因为 11.25 应该返回 11.25...
【解决方案2】:

这很有趣。我不知道为什么,但是每 3 pt 字体大小都会出现差异。

void btn_Click(object sender, EventArgs e) {
    StringBuilder sb = new StringBuilder();
    richTextBox.Text = "asdf";
    for (int i = 24; i <= 100; i++) {
        using (Font f = new Font(SystemFonts.DefaultFont.FontFamily, 1f * i / 4)) {
            richTextBox.SelectAll();
            richTextBox.SelectionFont = f;
            richTextBox.Font = f;
            sb.AppendLine(f.Size + "\t" + richTextBox.SelectionFont.Size + "\t" + Math.Round(f.Size - richTextBox.SelectionFont.Size, 3));
        }
    }
}

【讨论】:

  • 嗨,感谢您的回答:) 当文本从一个 rtb 移动到另一个时,差异似乎略有不同(更大)。比如我在rtb1中将选中文本的SelectioFont设置为14.25,复制到rtb2,再复制回rtb1(不做任何操作),字体为14.50。
猜你喜欢
  • 1970-01-01
  • 2017-12-31
  • 2021-07-02
  • 2021-01-30
  • 2019-04-07
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多