C#缩放用户控件内容以适应用户的Dpi /字体大小

10

如何使我的OwnerDrawn UserControl 尊重用户的dpi (96/120/xxx)和/或字体大小(normal, large, extra large)?

有些人建议在 Graphics 对象上使用 DpiX 和 DpiY 属性,但是这似乎对我的控件没有任何影响(即使我选择了哪种字体大小或 DPI,它们始终设置为 96)。

在 StackOverflow 上还有另一个类似的问题,其中建议使用 AutoScale 属性,但是建议的解决方案也没有什么作用。

.NET 中除了依赖于 WPF 外,是否没有其他方法可以实现此功能?

2个回答

11

你需要将UserControl的AutoScaleMode属性设置为AutoScaleMode.Dpi,不要将AutoScale属性设置为true。否则,它会将AutoScaleMode重置回None。AutoScale属性已经过时,仅用于向后兼容(请参阅此MSDN文章中的Important Note)。

此外,在Windows Vista/7中,除非您明确指定应用程序支持 DPI,否则Windows将模拟默认 DPI 环境,以便应用程序使用 96 DPI 渲染,然后缩放结果位图至适当大小。为了避免这种情况,您可以更改应用程序清单以通知Windows您实际上是 DPI 感知的 - 请参阅本文中的Using manifest to declare DPI awareness部分。


3

我遇到了相同的问题,我尝试使用GetDC + GetDeviceCaps + ReleaseDC方法,但使用Graphics方法工作,至少在Vista32上是这样的。虽然我对DPI不太熟悉,但没有人回答过这个问题,这至少对其他人有帮助。

请查看创建支持DPI应用程序。这里提到为什么它可能会始终返回96,而不管实际DPI设置如何。

引自上面链接中的内容:

 

Win32应用程序的DPI缩放

 

在Win32应用程序中,执行以下操作:

 
       
  • 使用SetProcessDPIAware函数取消DPI缩放。
  •    
  • 当调整绘制接口元素的大小时,请使用物理测量单位,例如厘米。通过使用物理尺寸而不是像素,可以确保在所有类型的显示器上都具有一致的大小。
  •    
  • 要获取系统DPI设置,请使用带有LOGPIXELSX标志的CDC::GetDeviceCaps函数。如果您没有取消dpi缩放,则此调用将返回默认值96 dpi。
  •    
  • 使用GetSystemMetrics函数获取用户界面元素(例如窗口边框)的首选大小。当禁用dpi缩放时,为接口元素返回的测量值将缩放到所选DPI设置。如果启用了dpi缩放,则函数以96 dpi为基础返回测量值,而不考虑系统dpi设置。
  •  

来自关于DPI问题的回答。

使用using语句重写的示例代码(原始来源):

float dpiX = 96, dpiY = 96;
using(Graphics graphics = this.CreateGraphics())
{
    dpiX = graphics.DpiX;
    dpiY = graphics.DpiY;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接