如何将工作区坐标转换为屏幕坐标?
How to convert workspace coordinates to screen coordinates?
我想将 GetWindowPlacement
在 rcNormalPosition.Left
和 rcNormalPosition.Top
中返回的工作区坐标转换为屏幕坐标,稍后我可以分配给 MainForm.Left
和 MainForm.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;
我想将 GetWindowPlacement
在 rcNormalPosition.Left
和 rcNormalPosition.Top
中返回的工作区坐标转换为屏幕坐标,稍后我可以分配给 MainForm.Left
和 MainForm.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;