【问题标题】:Save and restore form position and size using only NormalPosition from GetWindowPlacement仅使用 GetWindowPlacement 中的 NormalPosition 保存和恢复表单位置和大小
【发布时间】:2021-01-29 10:50:28
【问题描述】:

在 .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,MinPosition 到 -1,-1,等等)

让我担心的是the docs的这句话:

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

我应该担心吗?我只保存NormalPosition 的计划会导致某种奇怪的行为吗?

【问题讨论】:

  • 这不是完整的报价。完整的报价包含基本原理,并解释了您不必担心的原因。

标签: .net winforms winapi window-management window-position


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    • 1970-01-01
    相关资源
    最近更新 更多