2010-04-09 70 views
1

我有一个传统的WinForms应用程序,我希望跨会话保存窗口的位置和大小。在FormClosing和Load事件中,我一直使用GetWindowPlacementSetWindowPlacement。我得到的问题是,在更高的DPI设置(如中等,125%的尺寸)时,尺寸不断膨胀。我将以一定的大小调用SetWindowPlacement,但是当调用GetWindowPlacement时,即使窗口大小一直相同,这些数字也会增加25%。在表单中保存可调整大小的元素的大小时存在同样的问题。GetWindowPlacement/SetWindowPlacement无法在WinForms中工作以获得较高的DPI

现在这工作正常,如果我创建一个新的WinForms项目:即使在更高的DPI运行,大小保持稳定。我猜测这个项目还有一些遗留设置,或者一些神秘的表单设置让它变得糟糕,但我无法找到位置。

我在两个项目上都拨打了IsProcessDPIAware,两者都是true。有谁知道可能是什么原因造成的?

回答

1

我发现这个问题的窗体的.resx文件设置:

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

当这是目前,VS会自动改变AutoScaleBaseSize为 DPI工作,但没有其他人的。对于其他人来说,表格会不断增长或缩小。

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

1

听起来就像你以某种方式触发缩放,如表单的AutoScaleMode属性所选。两个项目之间的区别是AutoScaleDimensions属性,可在Designer.cs文件中看到。

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

+0

+1提示AutoScaleMode。 – RandomEngy 2010-04-09 17:21:15