微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

仅使用 GetWindowPlacement 中的 NormalPosition 保存和恢复表单位置和大小

如何解决仅使用 GetWindowPlacement 中的 NormalPosition 保存和恢复表单位置和大小

在 .NET Framework 4.6 和 Windows 窗体中,我有一个无边框窗体,没有标题栏,没有最小化和最大化按钮,可调整大小(使用自定义代码)。

我想使用 GetWindowPlacementSetWindowPlacement 保存和恢复表单位置和大小。

我从 GetwindowPlacement 获得这种值:

<WindowPlacement>
  <Length>44</Length>
  <Flags>0</Flags>
  <ShowCmd>1</ShowCmd>
  <MinPosition>
    <X>-1</X>
    <Y>-1</Y>
  </MinPosition>
  <MaxPosition>
    <X>-1</X>
    <Y>-1</Y>
  </MaxPosition>
  <normalPosition>
    <Left>949</Left>
    <Top>839</Top>
    <Right>1882</Right>
    <Bottom>1054</Bottom>
  </normalPosition>
</WindowPlacement>

我的表单/窗口没有最小化和最大化按钮,出于所有预期目的,它没有被设计为最小化/最大化,所以它应该始终恢复到正常的窗口状态。

因此,我只想将 normalPosition 中的 WindowPlacement 矩形保存到应用程序设置中。

加载表单时,我意图创建一个 WindowPlacement 结构,其中包含从设置加载的 normalPosition 字段,并使用认值填充其他值(ShowCmd 到 1,{{1} } 到 -1、-1 等)

令我担心的是来自the docs的这句话:

应该使用在 WINDOWPLACEMENT 结构中使用的坐标 只能通过 GetwindowPlacement 和 SetwindowPlacement 函数实现。

我应该担心吗?我只保存 MinPosition 的计划是否会出现某种奇怪的行为?

解决方法

应该使用在 WINDOWPLACEMENT 结构中使用的坐标 只能通过 GetWindowPlacement 和 SetWindowPlacement 函数实现。

文档中的上面一句话解释了这个问题的原因。这是由于使用了不同的坐标系。如果您的窗口没有 WS_EX_TOOLWINDOW 样式,则 rcNormalPosition 包含工作区坐标。

工作区坐标与屏幕坐标的不同之处在于它们采用 应用程序工具栏的位置和大小(包括 任务栏)考虑在内。工作区坐标 (0,0) 是左上角 工作区的一角,未被使用的屏幕区域 应用程序工具栏。

如果任务栏在屏幕顶部,假设高度是40,你得到的rcNormalPosition左上角是(0,0),那么它的屏幕坐标就是(0,0) . (左边的任务栏类似)

enter image description here

如果此行为影响您的应用程序,您应该考虑使用加载表单时保存的 SetWindowPlacement 调用 WindowPlacement

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。