1

我有一个旧版 WinForms 应用程序,我想跨会话保存窗口位置和大小。在 FormClosing 和 Load 事件期间,我一直在使用GetWindowPlacementSetWindowPlacement 。我遇到的问题是,在较高的 DPI 设置下(例如中等,大小为 125%),大小会不断膨胀。我会以一定的大小对其调用 SetWindowPlacement,但是当调用 GetWindowPlacement 时,即使窗口一直是相同的大小,这些数字也会变大 25%。在表单中保存可调整大小元素的大小时也存在同样的问题。

现在,如果我创建一个新的 WinForms 项目,这可以正常工作:即使以更高的 DPI 运行,大小也能保持稳定。我猜在项目的内部有一些遗留设置或一些神秘的表单设置把它搞砸了,但我不知道在哪里。

我在这两个项目上都调用了 IsProcessDPIAware并且都是true. 有谁知道这可能是什么原因造成的?

4

2 回答 2

1

听起来您以某种方式触发了缩放,由表单的 AutoScaleMode 属性选择。您的两个项目之间的区别在于 AutoScaleDimensions 属性,在 Designer.cs 文件中可见。

不知道为什么这会导致问题,但 Form 类已经在内部使用了 GetWindowPlacement()、RecreateHandleCore() 和 UpdateWindowState() 方法。为了获得真正的帮助,我假设您需要在某个地方发布一个复制项目。

于 2010-04-09T16:09:46.397 回答
1

我在表单的 .resx 文件中发现了这个有问题的设置:

<data name="$this.AutoScaleBaseSize" type="System.Drawing.Size, System.Drawing">
  <value>5, 13</value>
</data>

当它出现时,VS 会自动更改 AutoScaleBaseSize 以适用于您的DPI,但不会适用于其他人。对于其他人来说,表格会不断地增长或缩小。

在设计器属性面板中选择 AutoScaleMode = Font 会导致 VS 启动并“现代化”字体缩放设置。现在它适用于所有 DPI。

于 2010-04-09T16:39:08.893 回答