C#缩放UserControl内容以匹配用户Dpi /字体大小

9 .net c# user-controls dpi scale

如何让OwnerDrawn UserControl尊重用户dpi(96/120/xxx)和/或font-size(正常,大,超大)?

有些人建议在Graphics对象上使用DpiX和DpiY属性,但这似乎对我控制中的任何东西都没有(即它们总是设置为96,无论我选择哪种字体大小或dpi).

StackOverflow上还有另一个类似的问题,它建议使用AutoScale属性,但建议的解决方案也没有做任何事情.

除了依赖WPF之外,在.NET中没有办法做到这一点吗?

All*_*nek 11

您需要将UserControl 的AutoScaleMode属性设置为AutoScaleMode.Dpi,而不是将AutoScale属性设置为true.如果这样做,它会将AutoScaleMode重置为None.AutoScale属性已过时,仅用于向后兼容(请参阅本MSDN文章中重要说明).

此外,在Windows Vista/7中,除非明确指定应用程序支持DPI,否则Windows将模拟默认DPI环境,以便应用程序使用96 DPI进行渲染,然后将生成的位图缩放到适当的大小.为了避免这种情况,你可以改变你的应用程序清单,以通知Windows您实际上DPI知道-看到使用清单申报新闻部认识部分这篇文章.


CS.*_*CS. 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 缩放处于活动状态,则无论系统 dpi 设置如何,该函数都会返回基于 96 dpi 的测量值。

回复自:关于DPI问题

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

float dpiX = 96, dpiY = 96;
using(Graphics graphics = this.CreateGraphics())
{
    dpiX = graphics.DpiX;
    dpiY = graphics.DpiY;
}
Run Code Online (Sandbox Code Playgroud)