Question

Existe-t-il un moyen de spécifier le moniteur sur lequel une application apparaît dans Delphi ou C ++ Builder?

Je développe pour un client un programme simple, qui affiche les commandes de cuisine sur un moniteur secondaire, générées par un système d’accueil. Actuellement, ils doivent faire glisser manuellement la fenêtre sur le deuxième moniteur après son démarrage.

Était-ce utile?

La solution

Enregistrez la position de la fenêtre avant l’arrêt du programme et restaurez-la au démarrage. Les écrans multimonitor augmentent simplement la taille du bureau; Les autres surfaces du moniteur ont simplement une section différente du même plan X / Y dont l'origine est située en haut à gauche du moniteur principal.

Cela peut être fait automatiquement pour vous par n'importe lequel des nombreux composants .

BTW, la variable Screen de l’unité Formulaires a une propriété appelée MonitorCount et une autre propriété indexable, Monitors [Index: Integer]: TMonitor. TMonitor a des propriétés indiquant la gauche, le haut, la largeur, la hauteur, etc., de sorte que toutes les informations dont vous avez besoin sont là.

Autres conseils

L'objet Screen global (partie des formulaires) a le concept de Monitors. Je pense que cela a été ajouté vers Delphi 6 ou 7. Le code suivant fonctionnera:

// Put the form in the upper left corner of the 2nd monitor
//   if more then one monitor is present.
if Screen.MonitorCount > 1 then
begin
  Left := Screen.Monitors[1].Left;
  Top := Screen.Monitors[1].Top;
end;

Vous pouvez utiliser n'importe quel décalage positif à partir de cette position pour le placer n'importe où dans ce moniteur. Vous pouvez également obtenir la largeur et la hauteur pour connaître les dimensions.

Ce n'est pas vraiment la réponse que votre question implique, mais vous ne pourriez pas stocker les paramètres de la fenêtre (taille, position, état maximisé) lorsque l'application est fermée, puis les appliquer au démarrage?

procedure TMDIChild.btnShowMonClick(Sender: TObject);
begin
    if Screen.MonitorCount > 1 then
    begin
      FormShow.Left:=Screen.Monitors[1].Left;
      FormShow.Top:=Screen.Monitors[1].Top;
      FormShow.Width:=Screen.Monitors[1].Width;
      FormShow.Height:=Screen.Monitors[1].Height;
    end
    else
    begin
        FormShow.Show;
    end;
end;

J'ai fait la même chose il y a quelque temps dans Delphi 5:

procedure TForm18.FormCreate(Sender: TObject);
var
  Mon: TMonitor;
  MonitorIdx: Integer;
begin
  MonitorIdx := 1; // better read from configuration
  if (MonitorIdx <> Monitor.MonitorNum) and (MonitorIdx < Screen.MonitorCount) then begin
    Mon := Screen.Monitors[MonitorIdx];
    Left := Left + Mon.Left - Monitor.Left;
    Top := Top + Mon.Top - Monitor.Top;
  end;
end;

Windows vous permettra de spécifier les coordonnées d'une fenêtre dans l'appel de l'API CreateWindow. Je ne connais pas suffisamment Delphi ou C ++ Builder pour savoir si vous avez accès à cette partie du processus.

Vous pouvez également déplacer la fenêtre dans un gestionnaire WM_CREATE.

EnumDisplayMonitors vous donnera les coordonnées de chaque moniteur du système.


Il est évident que Delphi et C ++ Builder ont des fonctionnalités qui rendent cette réponse quelque peu dépourvue de pertinence. Je le laisse ici au cas où quelqu'un tomberait sur cette question mais aurait besoin d'une réponse pour un environnement différent.

Je ne fais pas grand chose avec les systèmes Windows, alors je suggérerais un hack comme celui-ci.

Saisissez la largeur du bureau visible (les deux moniteurs combinés), divisez-la par la moitié et faites-en votre position de départ.

Vous pouvez également regarder dans quelle api vous dit les dimensions de monitor2.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top