Boites de dialogues (Open et Save) et Multi Ecrans

Signaler
Messages postés
56
Date d'inscription
mardi 13 février 2007
Statut
Membre
Dernière intervention
22 juillet 2014
-
Messages postés
56
Date d'inscription
mardi 13 février 2007
Statut
Membre
Dernière intervention
22 juillet 2014
-
Bonjour,

Sur mon banc de test, j'ai 3 écrans (connecteur VGA et displayport de la carte mère, plus adaptateur USB3 vers HDMI).
Lorsque je lance mon appli et que je la déplace sur un autre écran, les boites de dialogues "OpenDialog" et "SaveDialog" s'ouvrent sur l'écran par défaut de windows et pas sur celui ou est l'application.

il y a bien
Screen.MonitorCount
pour trouver le nombre de moniteurs et
Screen.Monitors[I]
pour différencier chaque écran, mais je ne vois pas comment les associer aux boites de dialogues.

Comment ouvrir ces boites de dialogue sur l'écran ou se trouve mon appli quelque soit celui-ci ?

par avance, merci


PS : Delphi 2007, Win7
--

12 réponses

Messages postés
4719
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
1 février 2021
14
Bonjour,

comme ça sans trop chercher, car j'ai eu un problème similaire
avec deux écrans sur lesquels je souhaitais recevoir une chaîne de TV.
sur les deux j'avais le bureau, mais un seul recevait la chaîne..

j'ai configuré ma carte graphique et tout marche bien.

peut-être est-ce la solution, car dans ton cas, je suppose que sur les écrans qui ne reçoivent pas ces boites de dialogue, on voit quand même le bureau.

me dire...
Messages postés
56
Date d'inscription
mardi 13 février 2007
Statut
Membre
Dernière intervention
22 juillet 2014

Bonjour cs_cantador,

Les boites de dialogues s'affichent sur le MAIN DISPLAY ou s'affiche le bureau. Le bureau ne s'affiche pas sur les autres écrans.
J'ai essaye divers configurations et rien ne change.

--
Messages postés
4719
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
1 février 2021
14
Donc, sur les autres écrans,
tu n'as rien du tout comme affichage ?
Messages postés
4719
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
1 février 2021
14
et..
as-tu un driver de ta carte graphique ?
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
44
Salut à vous deux,

moi j'avais utilisé ceci avec succès sur une application multi-écrans ... à voir
Messages postés
56
Date d'inscription
mardi 13 février 2007
Statut
Membre
Dernière intervention
22 juillet 2014

non je n'ai rien a part le même fond d'écran que l'écran par défaut

je peux y placer des raccourcis...

je peux y déplacer mon appli et en double cliquant dessus elle se maximise bien que dans l'écran que je veux.

--
Messages postés
56
Date d'inscription
mardi 13 février 2007
Statut
Membre
Dernière intervention
22 juillet 2014

je regarde ton lien, Cirec


--
Messages postés
56
Date d'inscription
mardi 13 février 2007
Statut
Membre
Dernière intervention
22 juillet 2014

c'est du "C" et j'ai déjà du mal en Delphi

Sinon, n'y a t'il pas moyen de faire quelque chose directement du genre
SetWindowPos
avec un paramètre
Screen.Monitors[2]
juste avant l'appel de
OpenDialog
et remettre l'écran par défaut après la fin de l'utilisation de
OpenDialog
?

--
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
44
je fais pas de C non plus mais c'est pas un code très difficile:
unit UWin2Monitor;

interface

const
  MONITOR_CENTER   = $1;        // center rect to monitor
  MONITOR_CLIP     = $0;        // clip rect to monitor
  MONITOR_WORKAREA = $2;        // use monitor work area
  MONITOR_AREA     = $0;        // use monitor entire area

procedure ClipOrCenterWindowToMonitor(hwnd: THandle; flags: Integer);

implementation
uses Windows, MultiMon, Math;
//#include <windows.h>
//#include "multimon.h"


//
//  ClipOrCenterRectToMonitor
//
//  The most common problem apps have when running on a
//  multimonitor system is that they "clip" or "pin" windows
//  based on the SM_CXSCREEN and SM_CYSCREEN system metrics.
//  Because of app compatibility reasons these system metrics
//  return the size of the primary monitor.
//
//  This shows how you use the multi-monitor functions
//  to do the same thing.
//
procedure ClipOrCenterRectToMonitor(prc: PRect; flags: Integer);
var MonitorRect     : TRect;
    aWidth, aHeight : Integer;
    aMonitor        : hMonitor;
    mi              : MonitorInfo;
begin
  aWidth  := prc^.Right - prc^.Left;
  aHeight := prc^.Bottom - prc^.Top;
  // get the nearest monitor to the passed rect.       MONITOR_DEFAULTTONEAREST
  //
  aMonitor := MonitorFromRect(prc, MONITOR_DEFAULTTONEAREST);
    //
    // get the work area or entire monitor rect.
    //
    mi.cbSize := sizeof(mi);
    GetMonitorInfo(aMonitor, @mi);

    if (flags = MONITOR_WORKAREA) then
        MonitorRect := mi.rcWork
    else
        MonitorRect := mi.rcMonitor;

    //
    // center or clip the passed rect to the monitor rect
    //
    if (flags = MONITOR_CENTER) then
    begin
        prc^.left   := MonitorRect.left + (MonitorRect.right  - MonitorRect.left - aWidth) div 2;
        prc^.top    := MonitorRect.top  + (MonitorRect.bottom - MonitorRect.top  - aHeight) div 2;
        prc^.right  := prc^.left + aWidth;
        prc^.bottom := prc^.top  + aHeight;
    end
    else
    begin
        prc^.left   := max(MonitorRect.left, min(MonitorRect.right-aWidth,  prc^.left));
        prc^.top    := max(MonitorRect.top,  min(MonitorRect.bottom-aHeight, prc^.top));
        prc^.right  := prc^.left + aWidth;
        prc^.bottom := prc^.top  + aHeight;
    end;
end;

procedure ClipOrCenterWindowToMonitor(hwnd: THandle; flags: Integer);
var rc : TRect;
begin
    GetWindowRect(hwnd, rc);
    ClipOrCenterRectToMonitor(@rc, flags);
    SetWindowPos(hwnd, 0, rc.left, rc.top, 0, 0, SWP_NOSIZE or SWP_NOZORDER or SWP_NOACTIVATE);
end;
end.



exemple d'utilisation:
begin
  with TOpenDialog.Create(nil) do
  try
    ClipOrCenterWindowToMonitor(Handle, MONITOR_CENTER);
    Execute;
  finally
    Free;
  end;
end;


malheureusement je n'ai plus qu'un écran à disposition je ne peux donc plus tester ... mais on peut toujours affiner le code.

moi je sais que je suis parti de ce code et j'ai adapté à mes besoins ;)
Messages postés
56
Date d'inscription
mardi 13 février 2007
Statut
Membre
Dernière intervention
22 juillet 2014

avec ton exemple d'utilisation, la fenêtre "OpenDialog" s'ouvre toujours sur l'écran par défaut de Windows et pas sur celui de l'application.
je continue de chercher.

--
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
44
la solution est là ... malheureusement, comme dit plus haut, je n'ai plus de système à deux écrans à disposition ce qui m'empêche de poursuivre les testes
mais c'est la voie à suivre ... courage ;)
Messages postés
4719
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
1 février 2021
14
je reviens sur le sujet à propos de ce driver de ma carte graphique
(NVDIA..)qui gère les affichages de chaque écran connecté
mais dont je ne disposais par défaut sur mon PC..
Messages postés
56
Date d'inscription
mardi 13 février 2007
Statut
Membre
Dernière intervention
22 juillet 2014

Cela pourrait peut être fonctionner dans mon labo
Mais le soucis reviendra sur les machines clients dont j'aurais probablement pas l'autorisation de changer les drivers
Il me faudrait plutôt trouver la façon de faire fonctionner la solution de Cirec.