【问题标题】:Why does MeasureString insist extra height is required for text?为什么 MeasureString 坚持文本需要额外的高度?
【发布时间】:2020-08-20 20:39:19
【问题描述】:

在 Windows 10/.NET 4.8/Winforms 中针对表示打印机设备的图形对象测量字符串时,我得到了意想不到的结果:

var doc = new PrintDocument
{
    PrinterSettings = new PrinterSettings
    {
        PrinterName = "Microsoft Print to PDF",
        PrintToFile = true,
        PrintFileName = "c:\\temp\\test.pdf"
    }
};

doc.PrintPage += (object sender, PrintPageEventArgs e) =>
{
    var font = new Font("Verdana", 8, FontStyle.Regular);
    var format = new StringFormat
    {
        Alignment = StringAlignment.Near,
        FormatFlags = StringFormatFlags.LineLimit,
        LineAlignment = StringAlignment.Near,
        Trimming = StringTrimming.Word,
        HotkeyPrefix = HotkeyPrefix.None
    };

    var text = "0ZG0XLLJ620";
    var size = e.Graphics.MeasureString(text, font, new SizeF(300, 1000000), format);
    size = e.Graphics.MeasureString(text, font, new SizeF(size.Width, 1000000), format);

    e.Cancel = true;
};

doc.Print();

在第二次调用 MeasureString 时,size 的高度分量变大,而宽度变小。两个调用的返回大小不应该相同,尤其是因为第二个调用已经传递了足够宽以容纳文本的可用空间?

注意,这在 Windows7 中不会发生。事实上,您可以通过使用 Windows 7 中的 Verdana 覆盖 Windows 10 Verdana 来解决此问题。

【问题讨论】:

    标签: c# .net winforms graphics windows-10


    【解决方案1】:

    Windows 10 似乎会根据您渲染成的矩形的大小来不同地缩放字体。这不是一件坏事。

    如果您不希望布局矩形的大小影响文本的大小,则应使用MeasureString 的版本(如果您希望绘制的文本与测量的大小匹配,则应使用DrawString)它采用原点而不是布局矩形或布局矩形大小。

    【讨论】:

      猜你喜欢
      • 2022-01-26
      • 2015-08-24
      • 1970-01-01
      • 1970-01-01
      • 2012-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多