複数ディスプレイのサポート
FireMonkey では、複数ディスプレイでのアプリケーションの実行を自動的にサポートします。FireMonkey 複数ディスプレイ アプリケーションを動作させるためのプログラミングを特に実装する必要はありません。FireMonkey では、アプリケーションのユーザー インターフェイスの複数ディスプレイでのレイアウトを効果的に管理します。たとえば、メニュー、ダイアログ ボックス、その他のポップアップ コントロールは親フォームと同じディスプレイ上に開かれます。FireMonkey フレームワークでの複数ディスプレイのサポートは、VCL アプリケーションでのマルチモニタのサポートと似ています。
TScreen クラスには、複数ディスプレイのパラメータにアクセスできるようにするメソッドやプロパティが定義されていることに注意してください。アプリケーションでは、TScreen 型のグローバル変数 Screen が自動的に作成されます。Screen は、アプリケーションが動作している画面の状態をカプセル化したものです。Screen を使用すると、(デスクトップを構成するのに使用されている)ディスプレイのリストと、それらのディスプレイの座標や寸法などのプロパティを取得できます。DisplayCount プロパティはディスプレイの数を返します。また、Displays プロパティにより、すべてのディスプレイのプロパティにアクセスできます。座標はすべて、仮想画面座標です。仮想画面座標は、主ディスプレイを基準とする相対座標で、ピクセル単位で測定されます。仮想画面は、デスクトップを構成するのに使用されているすべてのディスプレイの境界となる四角形です。
たとえば、次のようなコードを使用して複数ディスプレイのパラメータを取得できます。
type
TForm1 = class(TForm)
Memo1: TMemo;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
private
procedure UpdateMemo;
function RectToStr(R: TRect): String;
function DispToStr(Disp: TDisplay): String;
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
function TForm1.RectToStr(R: TRect): String;
begin
Result := '(' + Inttostr(R.Left) + ',' + Inttostr(R.Top) + ' x ' + Inttostr(R.Width) + ',' + Inttostr(R.Height) + ')';
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Screen.UpdateDisplayInformation;
if (Screen.DisplayCount > 0) and (Screen.Displays[Screen.DisplayCount - 1].Index > 0) then
Timer1.Tag := Timer1.Tag + 1;
UpdateMemo;
end;
function TForm1.DispToStr(Disp: TDisplay): String;
begin
Result := Inttostr(Disp.Index) + '. ';
if Disp.Primary then
Result := Result + ' Primary ';
Result := Result + SLineBreak;
Result := Result + 'WorkAreaRect: ' + RectToStr(Disp.WorkareaRect) + '; ';
Result := Result + SLineBreak;
Result := Result + 'BoundsRect: ' + RectToStr(Disp.BoundsRect) + '; ';
end;
procedure TForm1.UpdateMemo;
var
I: Integer;
P: TPoint;
begin
Memo1.Lines.Clear;
P := TPoint.Create(Round(Screen.MousePos.X), Round(Screen.MousePos.Y));
Memo1.Lines.Add('Screen');
Memo1.Lines.Add('MousePos: ' + FloatToStr(P.X) + ' ' + FloatToStr(P.Y));
Memo1.Lines.Add('DisplayFromForm(Self).Index: ' + Inttostr(Screen.DisplayFromForm(Self).Index));
Memo1.Lines.Add('Size.cx: ' + IntToStr(Screen.Size.cx));
Memo1.Lines.Add('Size.cy: ' + IntToStr(Screen.Size.cy));
Memo1.Lines.Add('DisplayCount: ' + Inttostr(Screen.DisplayCount));
Memo1.Lines.Add('WorkAreaRect: ' + RectToStr(Screen.WorkAreaRect));
Memo1.Lines.Add('DesktopRect: ' + RectToStr(Screen.DesktopRect));
Memo1.Lines.Add('Displays');
for I := 0 to Screen.DisplayCount - 1 do
Memo1.Lines.Add(DispToStr(Screen.Displays[I]));
Memo1.Lines.Add('Form');
Memo1.Lines.Add('BoundsRect: ' + RectToStr(TRect.Create(TPoint.Create(Left, Top), Width, Height)));
end;
end.
上記のコードを実行し、アプリケーションを副ディスプレイに移動した場合、Memo1 には次のような出力が表示されます。
Screen MousePos: 1530 294 DisplayFromForm(Self).Index: 1 Size.cx: 1280 Size.cy: 1024 DisplayCount: 2 WorkAreaRect: (0,0 x 1280,1024) DesktopRect: (0,0 x 2560,1024) Displays 0. Primary WorkAreaRect: (0,0 x 1280,1024); BoundsRect: (0,0 x 1280,1024); 1. WorkAreaRect: (1280,0 x 1280,1024); BoundsRect: (1280,0 x 1280,1024); Form BoundsRect: (1472,199 x 648,507)
ここでは、副ディスプレイに関係するいくつかのパラメータを太字で強調表示していることに注意してください。