从其它平台迁移而来


在开发多屏应用程序的时候,经常需要把某个窗口置到某个屏上的某个位置。以下是一个Delphi写的置屏方法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
procedure ShowInMonitor(Sender: TObject; AIndex: Integer; ALeft: Integer = 0; ATop: Integer = 0);
var
  lM: TMonitor;
begin
  if Sender is TControl then
  begin
    if AIndex > Screen.MonitorCount - 1 then
    begin
      AIndex := 0;
    end;
    lM := Screen.Monitors[AIndex];
    (Sender as TControl).Left := lM.Left + ALeft;
    (Sender as TControl).Top := lM.Top + ATop;
  end;
end;

Sender是需要置屏的窗口;AIndex是置屏的目标屏号,从0开始;ALeft是水平偏移量,ATop是垂直偏移量,默认均为0,即在目标屏的左上角。

通常情况下,使用该方法对当前窗口置屏,是没有任何问题的。

但是,对于动态创建的窗口,很可能就会发现不正常。今天一上午都在弄这货,始终没搞定,到下午突然发现症结,然后一下子就好了,在此做个记录备忘。

问题很简单:是调用顺序的问题。正确的调用顺序应该是Show->ShowInMonitor