如何将工作空间坐标转换为屏幕坐标?

时间:2015-04-20 11:57:03

标签: delphi coordinates delphi-2009

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

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

最简单,最干净的方法是使用与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));