【问题标题】:How to convert workspace coordinates to screen coordinates?如何将工作区坐标转换为屏幕坐标?
【发布时间】:2015-04-20 11:57:03
【问题描述】:

我想将GetWindowPlacementrcNormalPosition.LeftrcNormalPosition.Top 中返回的工作区坐标转换为我可以稍后分配给MainForm.LeftMainForm.Top 的屏幕坐标。我该怎么做?

【问题讨论】:

  • 我不明白你的问题,因为它是一样的。我在这里做了一个小测试:pastebin.com/uQyCZrB1 它总是一样的
  • @JensBorrisholt 不一样。例如,考虑一下任务栏是上对齐还是左对齐。
  • 在保存和恢复表单位置时,我强烈建议您在应用程序关闭时为自己保存一些有关工作空间设置的额外信息。为什么?自上次运行应用程序以来,工作区设置可能已更改(上次应用程序可能已显示在不再连接的第二个监视器上)。如果无法检测到这一点,您可能会将应用程序放置在当前可见区域之外。我已经看到许多应用程序未能做到这一点,将此类应用程序重新放回可见区域可能会非常痛苦。
  • @Silver 保存工作空间不是前进的方向。在给定当前工作区的情况下,只需强制窗口可见。这将保护您免受所有隐藏表单故障模式的影响。
  • @DavidHeffernan 如果您只是强制窗口可见,那么您将剥夺用户预先安排最适合该用户需要的应用程序窗口的机会。这正是 OP 似乎试图为他的应用程序用户提供的东西。现在我已经看到应用程序不仅存储工作空间信息只是为了确保在下次启动时应用程序窗口将被放置在可见区域中,而且还为用户提供能够为不同的工作空间设置设计单独的应用程序布局。这对笔记本电脑用户来说非常有用。

标签: delphi coordinates delphi-2009


【解决方案1】:

您可以使用表单的monitor 属性来确定表单所在的监视器的工作区是否与监视器的位置有任何偏移。例如

ScreenLeft := wplc.rcNormalPosition.Left + 
                Monitor.WorkareaRect.Left - Monitor.Left;
ScreenTop := wplc.rcNormalPosition.Top + 
                Monitor.WorkareaRect.Top - Monitor.Top;

【讨论】:

    【解决方案2】:

    最简单最干净的方法是使用与GetWindowPlacement合作的API函数,即SetWindowPlacement。这样您就不需要在工作区和屏幕坐标之间进行转换,因为您让系统为您完成工作。

    var
      WindowPlacement: TWindowPlacement;
    ....
    WindowPlacement.length := SizeOf(WindowPlacement);
    Win32Check(GetWindowPlacement(Handle, WindowPlacement));
    ....
    Win32Check(SetWindowPlacement(Handle, WindowPlacement));
    

    在上面的代码中,Handle 被假定为窗体的窗口句柄。

    如果您保留了左侧和顶部,那么您将像这样恢复它们:

    var
      WindowPlacement: TWindowPlacement;
    ....
    WindowPlacement.length := SizeOf(WindowPlacement);
    Win32Check(GetWindowPlacement(Handle, WindowPlacement));
    WindowPlacement.rcNormalPosition.Left := NewLeft;
    WindowPlacement.rcNormalPosition.Top := NewTop;
    Win32Check(SetWindowPlacement(Handle, WindowPlacement));
    

    【讨论】:

    • 当我使用SetWindowPlacement 时,我必须设置WindowPlacement 结构的所有成员吗?因为我不明白所有这些......
    • 你调用了GetWindowPlacement,它初始化了结构。您无需设置任何内容。
    • 我想获取展示位置,将其保存在注册表中,下次程序启动时恢复展示位置。
    • 所以继续做吧。要么保留结构的所有成员,要么只保留 pos。如果您选择后者而不是致电GetWindowPlacement 填写您不坚持的内容。
    • FTR,这个解决方案没有副作用,因为没有像人们怀疑的那样更新 FLeft,FTop,因为它们在 WM_WINDOSPOSCHANGED 中更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多