Prise en charge des affichages multiples

De RAD Studio
Aller à : navigation, rechercher

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.

Voir aussi