【问题标题】:GetWindowPlacement/SetWindowPlacement not working in WinForms for high DPIGetWindowPlacement/SetWindowPlacement 在 WinForms 中无法用于高 DPI
【发布时间】:2010-04-09 15:48:49
【问题描述】:

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

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

我在这两个项目上都给IsProcessDPIAware 打电话,而且都是true。有谁知道这可能是什么原因造成的?

【问题讨论】:

    标签: c# winforms dpi window-management


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2018-08-07
        • 1970-01-01
        • 1970-01-01
        • 2021-08-19
        • 1970-01-01
        • 1970-01-01
        • 2015-04-23
        • 1970-01-01
        • 2010-12-23
        相关资源
        最近更新 更多