我有一个传统的WinForms应用程序,我希望在会话中保存窗口位置和大小。我在FormClosing和Load事件期间一直使用GetWindowPlacement和SetWindowPlacement。我得到的问题是,在较高的DPI设置(例如中等,大小为125%)下,尺寸会持续膨胀。我会用一定的大小调用SetWindowPlacement,但是当调用GetWindowPlacement时,这些数字会回来大25%,即使窗口一直都是相同的大小。在表单中保存可调整大小元素的大小时存在同样的问题。
现在,如果我创建一个新的WinForms项目,这可以正常工作:即使在较高的DPI下运行,大小也会保持稳定。我猜测项目内容中有一些遗留设置,或者某些神秘的Form设置搞砸了,但我找不到它。
我在两个项目上都调用了IsProcessDPIAware,两者都是true
。有谁知道可能导致这种情况的原因?
答案 0 :(得分:1)
听起来像是以某种方式触发缩放,正如表单的AutoScaleMode属性所选择的那样。两个项目之间的区别在于AutoScaleDimensions属性,可在Designer.cs文件中看到。
不确定为什么这会导致问题,但Form类已经在内部使用了GetWindowPlacement(),重新使用了RecreateHandleCore()和UpdateWindowState()方法。为了获得真正的帮助,我认为你需要在某个地方发布一个repro项目。
答案 1 :(得分:1)
我在表单的.resx文件中找到了这个有问题的设置:
<data name="$this.AutoScaleBaseSize" type="System.Drawing.Size, System.Drawing">
<value>5, 13</value>
</data>
如果存在,VS会自动更改AutoScaleBaseSize以用于您的 DPI,但没有其他人。对于其他人来说,表格会不断增长或缩小。
在设计器属性面板中选择AutoScaleMode = Font会导致VS启动并“缩小”字体缩放设置。现在它适用于所有DPI。