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

How to convert workspace coordinates to screen coordinates?

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

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

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

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

如果你坚持了左边和顶部,那么你会像这样恢复它们:

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

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

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