【问题标题】:MeasureString() gives different size for different screen resolutionsMeasureString() 为不同的屏幕分辨率提供不同的大小
【发布时间】:2015-11-20 12:34:20
【问题描述】:

我们使用Measurestring() 根据文本长度计算大小。对于不同的屏幕分辨率,MeasureString() 给出不同的尺寸。

Graphics g;  
Size size = g.MeasureString(GetItemText(this.Items[n]), this.Font).ToSize();  
width=size.width;       

对于屏幕分辨率 125%size.width=76 和 对于屏幕分辨率100% 和 150%size.width=61

如何在这段代码中获得相同的宽度,请建议我使用 measurestring() 测量尺寸的一些想法。

等待建议........

【问题讨论】:

  • 你用这个度量做什么?如果Graphics 来自屏幕上显示的内容,那么显然大小会随着屏幕分辨率而变化。这才是重点。如果您想要特定分辨率的大小,您可以在该分辨率下创建一个Bitmap,并使用其Graphics 对象来测量字符串。
  • 你也可以看看msdn.microsoft.com/en-us/library/…,即PageUnit属性
  • 这是完全正常的,字体大小以 points 表示。一点是 1/72 英寸。当您将视频适配器的 DPI 增加到 125% 时,英寸到像素的映射比率会发生变化。从每英寸 96 像素到每英寸 120 像素。所以你需要更多的像素来获得相同的点大小。从而从 MeasureString 中获得大约 125% 的结果。当你上升到 150% 并且没有声明你的应用程序是 dpiAware 时,Windows 的 dpi 虚拟化功能就会启动。它的 dpi 是 96 并重新调整你的窗口本身。很明显,文字很模糊。
  • @HansPassant,我认为问题不清楚。我对从文件加载的 2 个 png 文件有同样的问题。两者都是 128x128 像素,一张是 75dpi,另一张是 150dpi。 MeasureString 使用相同字体返回 14.xx 和另一个 28.xx,稍后在表单上绘制这两个图像时,它们的大小相同,但一个图像上的文本是另一个图像的一半大小。 Do PNGs (or JPGs) have a DPI
  • 这完全取决于显示图像的程序。许多人注意图像 dpi,只是简单地缩放图像以适应窗口/屏幕。在 .NET 中,Graphics.DrawImage() 方法需要注意,而 PictureBox 则不需要。

标签: c# .net system.drawing dpi


【解决方案1】:

这是因为默认情况下 125% 的行为不同。例如,在 Windows 7 中,如果您更改 DPI 设置,由于 Windows XP 样式 模式,应用程序将知道当前的 DPI 设置。但是,如果设置为 150%,则默认情况下不会设置此复选框,因此应用程序将在 DPI 不感知模式下工作,这意味着 MeasureString 将返回与 96 DPI 相同的结果,并且调整大小将由 Windows 自动执行。

通常您可以忽略结果,因为无论如何尺寸都会在您的应用程序中放大。如果还想获取 Windows 的实际 DPI 值,请看我的回答:https://stackoverflow.com/a/33412669/5114784

然后您可以像这样放大您的绘图(但正如我所说,通常不需要这样做):

// See GetSystemDpi in the referenced post
float zoomFactor = (float)GetSystemDpi() / 96f;
size.Width = (int)(size.Width * zoomFactor);
size.Height = (int)(size.Height * zoomFactor);

【讨论】:

    猜你喜欢
    • 2017-03-24
    • 2011-07-19
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多