Boites de dialogues (Open et Save) et Multi Ecrans

drexl Messages postés 56 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 22 juillet 2014 - 4 juin 2014 à 11:49
drexl Messages postés 56 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 22 juillet 2014 - 5 juin 2014 à 14:25
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

cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
4 juin 2014 à 12:40
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...
0
drexl Messages postés 56 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 22 juillet 2014
4 juin 2014 à 12:52
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.

--
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
4 juin 2014 à 15:26
Donc, sur les autres écrans,
tu n'as rien du tout comme affichage ?
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
4 juin 2014 à 15:28
et..
as-tu un driver de ta carte graphique ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
4 juin 2014 à 15:34
Salut à vous deux,

moi j'avais utilisé ceci avec succès sur une application multi-écrans ... à voir
0
drexl Messages postés 56 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 22 juillet 2014
4 juin 2014 à 15:35
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.

--
0
drexl Messages postés 56 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 22 juillet 2014
4 juin 2014 à 15:38
je regarde ton lien, Cirec


--
0
drexl Messages postés 56 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 22 juillet 2014
4 juin 2014 à 15:56
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
?

--
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
4 juin 2014 à 17:04
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 ;)
0
drexl Messages postés 56 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 22 juillet 2014
5 juin 2014 à 08:46
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.

--
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
5 juin 2014 à 13:26
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 ;)
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
5 juin 2014 à 14:16
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..
0
drexl Messages postés 56 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 22 juillet 2014
5 juin 2014 à 14:25
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.
0
Rejoignez-nous