Unterstützung für mehrere Displays
Nach oben zu FireMonkey-Anwendungsdesign
FireMonkey unterstützt automatisch die Ausführung von Anwendungen auf mehreren Displays. Sie müssen programmseitig keine Vorkehrungen für die Unterstützung der Ausführung einer FireMonkey-Anwendung auf mehreren Displays treffen. FireMonkey verwaltet effektiv das Layout der Benutzeroberfläche der Anwendung auf mehreren Displays. Beispielsweise werden Menüs, Dialogfelder und andere Popup-Steuerelemente auf demselben Display wie das übergeordnete Formular geöffnet. Die Multi-Display-Unterstützung im FireMonkey-Framework entspricht der Unterstützung für mehrere Bildschirme in VCL-Anwendungen.
In der Klasse TScreen sind Methoden und Eigenschaften für den Zugriff auf Parameter von mehreren Displays definiert. Ihre Anwendung erstellt automatisch eine globale Screen-Variable mit dem Typ TScreen. Screen kapselt den Status des Bildschirms, auf dem die Anwendung angezeigt wird. Mit Screen rufen Sie eine Liste der Displays (aus denen der Desktop zusammengesetzt ist) und Koordinaten, Dimensionen und andere Eigenschaften dieser Displays ab. Die Eigenschaft DisplayCount gibt die Anzahl der Displays zurück, und Displays ermöglicht den Zugriff auf Eigenschaften aller Displays. Alle Koordinaten sind virtuelle Bildschirmkoordinaten. Virtuelle Bildschirmkoordinaten sind relativ zum primären Display und werden in Pixel gemessen. Der virtuelle Bildschirm ist ein Rechteck, das alle Displays, aus denen der Desktop zusammengesetzt ist, umgibt.
Beispielsweise können Sie mit Code wie dem folgenden Parameter von mehreren Displays abrufen:
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.
Wenn Sie diesen Code ausführen und die Anwendung auf das sekundäre Display verschieben, kann in Memo1 die folgende Ausgabe angezeigt werden:
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)
In der obigen Ausgabe wurden einige, auf das sekundäre Display bezogene Parameter in Fettschrift markiert.