我想将GetWindowPlacement
和rcNormalPosition.Left
中rcNormalPosition.Top
返回的工作区坐标转换为我稍后可以分配给MainForm.Left
和MainForm.Top
的屏幕坐标。我怎么能这样做?
答案 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));