我在一家公司工作,我们的旗舰产品是Winforms应用程序。最近我们重新设计了品牌和用户界面。我们发现表单现在无法正确显示文本,有些控件不对齐或已经消失在边缘之外。
我能否使此应用程序上的表单具有DPI感知功能,而不需要进行过多的重构,因为我们没有时间。
我能否使此应用程序上的表单具有DPI感知功能,而不需要进行过多的重构,因为我们没有时间。
非常重要的一点是不要指定像素坐标和大小。这就排除了使用 Control.Top
和 Control.Left
,因为在“仅仅放置”控件在窗体上时,设计师会使用它们。
为了实现适用于不同 DPI 设置的 UI,几乎所有内容都必须是动态大小的。控件应启用 Control.AutoSize
。但仅启用 AutoSize
将完全破坏您的布局,因为控件位置仍然是静态的。
为了使控件动态定位,可以使用容器控件,如FlowLayoutPanel
和TableLayoutPanel
(大小设置为 AutoSize
)。然后,这些容器中的普通控件会根据自动确定的大小在窗体上移动。
正如您所见,这并不简单,需要一些经验才能做到恰当,并且需要大量测试(具有不同 DPI 设置的虚拟机效果非常好)。但我认为一定要做,因为如果某些东西在我的笔记本电脑上看起来很愚蠢和有问题,我总是感到很烦恼。
最快的方法是重写OnPaint并使用Graphics.DpiX和DpiY属性。请参考http://msdn.microsoft.com/en-us/library/ms701681(VS.85).aspx,唯一的建议是使用清单文件而不是SetDpiAware。