0

在 .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 等)

让我担心的是文档中的这句话:

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

我应该担心吗?我的计划是否可以通过仅保存NormalPosition.

4

1 回答 1

0

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

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

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

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

在此处输入图像描述

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

于 2021-02-01T03:11:10.983 回答