首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#缩放UserControl内容以匹配用户Dpi/字体大小

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

Stack Overflow用户
提问于 2009-02-21 11:20:30
回答 2查看 25.8K关注 0票数 10

如何让我的OwnerDrawn UserControl尊重用户dpi (96/120/xxx)和/或字体大小(正常、大、超大)?

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

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

除了依赖WPF之外,在.NET中没有其他方法可以做到这一点吗?

EN

回答 2

Stack Overflow用户

发布于 2009-08-19 12:40:45

您需要将UserControl的UserControl属性设置为AutoScaleMode.Dpi,而not则需要将AutoScale属性设置为true。如果您这样做了,它将把AutoScaleMode重新设置为None。AutoScale属性已经过时,仅为向后兼容性而存在(请参阅此MSDN文章中的重要注释)。

另外,在Windows /7中,除非明确指定应用程序是新闻部感知的,否则Windows将模拟默认DPI环境,以便应用程序使用96 DPI呈现,然后将结果位图缩放到适当的大小。为了避免这种情况,您可以修改应用程序清单,以通知Windows您实际上了解新闻部-请参阅这篇文章中的“使用清单声明新闻部意识”部分。

票数 11
EN

Stack Overflow用户

发布于 2009-08-04 08:06:23

我也有同样的问题,我尝试使用GetDC + GetDeviceCaps + ReleaseDC,除了使用图形工作,至少在Vista32上。我对新闻部还没有经验,但没有人回答这个问题,至少这可能对其他人有帮助。

看看创建可感知新闻部的应用程序。这提到了为什么无论新闻部的实际设置如何,它总是返回96。

引用上述链接:

新闻部在Win32应用程序中的缩放 在Win32应用程序中,执行以下操作:

  • 使用SetProcessDPIAware函数取消dpi缩放。
  • 当调整绘制的接口元素的大小时,使用物理测量,例如厘米。通过使用物理维度而不是像素,可以确保对所有类型的显示进行一致的调整。
  • 要获得system设置,可以使用带有LOGPIXELSX标志的CDC::GetDeviceCaps函数。如果不取消dpi缩放,则此调用将返回默认值96 dpi。
  • 使用GetSystemMetrics函数获得用户界面元素的首选大小,例如窗口边框。当禁用dpi缩放时,为接口元素返回的度量值将缩放到选定的dpi设置。如果dpi缩放是活动的,则函数将返回基于96 dpi的度量,而不管系统dpi设置如何。

答案来自:关于新闻部问题

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

代码语言:javascript
复制
float dpiX = 96, dpiY = 96;
using(Graphics graphics = this.CreateGraphics())
{
    dpiX = graphics.DpiX;
    dpiY = graphics.DpiY;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/572820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档