Prise en charge des affichages multiples
Remonter à Conception d'applications FireMonkey
FireMonkey supporte automatiquement l'exécution d'une application sur des affichages multiples. Vous n'avez pas besoin d'implémenter une programmation pour supporter l'exécution d'une application FireMonkey sur des affichages multiples. FireMonkey gère efficacement la disposition de l'interface utilisateur de l'application sur des affichages multiples. Par exemple, les menus, les boîtes de dialogue et les autres contrôles pop-up s'ouvrent sur le même affichage que la fiche parent. Le support des affichages multiples dans le framework FireMonkey est semblable au support multi-moniteur dans les applications VCL.
Notez que la classe TScreen définit les méthodes et les propriétés permettant d'accéder aux paramètres des affichages multiples. Votre application crée automatiquement une variable globale Screen, de type TScreen. Screen encapsule l'état de l'écran sur lequel l'application s'exécute. Utilisez Screen pour obtenir une liste d'affichages (utilisés pour constituer le bureau) et de coordonnées, de dimensions, et d'autres propriétés de ces affichages. La propriété DisplayCount renvoie le nombre d'affichages et Displays fournit un accès aux propriétés de tous les affichages. Toutes les coordonnées sont des coordonnées d'écran virtuel. Les coordonnées d'écran virtuel sont relatives à l'affichage primaire et sont mesurées en pixels. L'écran virtuel est le rectangle de délimitation de tous les affichages constituant le bureau.
Par exemple, vous pouvez utiliser le code suivant pour récupérer les paramètres d'affichages multiples :
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.
Si vous exécutez ce code et déplacez l'application dans l'affichage secondaire, le mémo Memo1 peut afficher la sortie suivante :
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)
Notez que nous avons ici affiché en gras certains paramètres relatifs à l'affichage secondaire.