【发布时间】:2013-11-26 06:22:22
【问题描述】:
我们有一个现有的 windows .net 应用程序,它使用所有自定义控件。
这几天一切都很好,因为我们只支持默认的 96 dpi 分辨率。
现在我们需要我们的应用程序具有 dpi 感知能力。当我们转到下一个时,事情变得混乱了
更高分辨率 120 或 144 等。
最常见的问题
位图缩放问题和
文本截断
经过these MSDN 文档和existing SO 问题后,我尝试了
在我的应用程序中加入这样的修复是徒劳的(因为使用的所有控件都是
自定义且不支持 dpi)。
在修改我的 application.manifest 以启用 dpi-awareness 标志并在主窗体上将 AutoScaleMode 设置为 AutoScaleMode.Dpi 和其他窗体使用 AutoScaleMode 作为继承后,我尝试过的事情
- 更改了 OnLoad 事件中的控件字体
图形 g = this.CreateGraphics(); int dpi = int.Parse(g.DpiX.ToString());
switch (dpi)
{
case 125:
this.Font = new Font(this.Font.FontFamily, this.Font.Size * 125.0f / (float)(g.DpiX));
Debug.WriteLine("<<---- Selected DPI Resolution :" + " 125 DPI ---->");
break;
... so on
- 尝试覆盖 ScaleControl 方法以利用基于 DPI 的不同缩放因子
但在我的情况下,所有这些似乎都不起作用。
有谁知道/建议我更好的方法来解决这个问题。
谢谢
VATSAG
【问题讨论】:
-
这个
int dpi = int.Parse(g.DpiX.ToString());震动了我的内心。关于问题,我认为,您不应该通过开关检查 DPI。 总是使用公式,公式应该适用于任何 dpi。您可能需要重新设计布局,仅使用自动调整大小的Labels 并将它们放在TableLayoutPanel内(以保证哪些控件不会重叠)等。如果在PictureBox内,位图应该没问题。如果您的意思是您的自定义控件,那么再次 - 公式+布局。 -
对不起,如果我在这里听起来很愚蠢..这里的公式是什么意思?
-
以图片为例:
new_width = width * scale * old_dpi / new_dpi;.
标签: c# .net winforms scaling dpi