IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Propriétés de Screen.Monitors[x] erronées si multi-écrans [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    261
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 261
    Par défaut Propriétés de Screen.Monitors[x] erronées si multi-écrans
    Bonjour,

    Souhaitant dans une application adapter la taille et les caractères d'une fiche à la résolution de l'écran (autrement que par le DPI automatique de Windows 10 donnant un aspect "baveux" aux caractères), je pensais utiliser la propriété Screen.Monitors[x].PixelsPerInch de cet écran. Malheureusement il semble bien que la valeur retournée par cette propriété soit toujours celle de l'écran primaire, du moins sous Windows 10.
    Pour tester les propriétés des écrans, créez une forme avec un bouton:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    procedure TForm1.Button1Click(Sender:TObject);
    var
      i:integer;
      s:String;
    begin
      s:='';
      for i:=0 to Screen.MonitorCount-1 do
      begin
        with Screen.Monitors[i] do
        begin
          if i>0 then
            s:=s+LineEnding+LineEnding;
          s:=s+'Écran n°'+IntToStr(MonitorNum+1)+LineEnding;
          s:=s+'    Primary '+BoolToStr(Primary,True)+LineEnding;
          s:=s+'    PixelsPerInch '+IntToStr(PixelsPerInch)+LineEnding;
          s:=s+'    Left '+IntToStr(Left)+LineEnding;
          s:=s+'    Width '+IntToStr(Width)+LineEnding;
          s:=s+'    Top '+IntToStr(Top)+LineEnding;
          s:=s+'    Height '+IntToStr(Height);
        end;
      end;
      ShowMessage(s);
    end;
    Sur mon portable ayant un écran primaire 15,6" 1920x1080 et un écran secondaire 21" 1680x1050 à droite aligné en bas,
    si les 2 écrans les paramètres d'affichage sont identiques (100% = 96DPI) j'obtiens les résultats suivants:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Écran n°1
        Primary True
        PixelsPerInch 96
        Left 0
        Width 1920
        Top 0
        Height 1080
     
    Écran n°2
        Primary False
        PixelsPerInch 96
        Left 1920
        Width 1680
        Top 27
        Height 1050
    Seul le Top=27 m'étonne un peu (comme l'écran est aligné en bas, Top devrait être 1080-1050=30).
    Si je défini les propriétés de l'écran primaire sur 125% = 120 DPI comme recommandé (redémarrage obligatoire) sans modifier celle du secondaire j'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Écran n°1
        Primary True
        PixelsPerInch 120
        Left 0
        Width 1920
        Top 0
        Height 1080
     
    Écran n°2
        Primary False
        PixelsPerInch 120
        Left 2400
        Width 2100
        Top 34
        Height 1313
    On voit que toutes les propriétés de l'écran n°2 ont été multipliées par 120/96=1.25.
    Des tests effectués sur une autre configuration donnent des résultats similaires: le PixelsPerInch retourné pour l'écran secondaire est toujours identique à celui de l'écran primaire et les propriétés sont multipliées par le rapport des résolutions.
    Je pensais à un problème Lazarus, mais un essai avec un logiciel Delphi 7 donne le même TopLeft (2400,34) que l'écran n°2 ci-dessus.
    Est-ce un problème W10, Lazarus-D7 ou une erreur de compréhension de ma part?

    André

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 934
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 934
    Par défaut
    C'est une question de manifest. Il faut avertir l'OS que ton app supporte le redimensionnement par moniteur, ce qui correspond pour dpiAware à true/pm (pm=per monitor).
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <asmv3:application>
      <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
        <dpiAware>True/PM</dpiAware>
      </asmv3:windowsSettings>
    </asmv3:application>

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    261
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 261
    Par défaut
    Bien vu. Les résultats sont bons en activant le DPI avec support par moniteur.
    Il ne m'était pas venu à l'idée que l'activation du DPI pouvait avoir une influence sur ces résultats. Les dimensions en pixels d'un écran sont bien des mesures "physiques" qui devraient être immuables. Ce n'est pas parce qu'on demande d'afficher les caractères en utilisant plus de lignes qu'on change le nombre de lignes de l'écran.

    André

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 934
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 934
    Par défaut
    Citation Envoyé par alanglet Voir le message
    Les dimensions en pixels d'un écran sont bien des mesures "physiques" qui devraient être immuables.
    On ne connait pas les caractéristiques physiques de l'écran, on récupère tout au plus la résolution sélectionnée sur la carte graphique.

  5. #5
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Salut,
    Citation Envoyé par Andnotor Voir le message
    On ne connait pas les caractéristiques physiques de l'écran, on récupère tout au plus la résolution sélectionnée sur la carte graphique.
    Euh, t'es sûr de ce que tu dis, là ?

    Tu n'oublierais pas toute la partie DDC qui permet à la carte graphique de savoir ce qu'elle a au bout du câble pour lui envoyer des informations correctes, et ensuite retourner les paramètres de l'écran à l'OS ?

    Citation Envoyé par wikipedia
    Les modèles actuels associent généralement deux types d’interfaces : une interface pour la télévision (S-Vidéo ou HDMI) avec une interface pour écran d’ordinateur (VGA ou DVI). Dans le cas des interfaces analogiques, certaines lignes des signaux servent à transmettre des informations concernant certaines données spécifiques à l'écran utilisé. L'écran peut transmettre des informations comme la définition optimale et ses taux limites de rafraichissement
    .
    source (2e §)

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 934
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 934
    Par défaut
    Tu peux récupérer quelques informations par WMI mais je ne connais aucune fonction permettant de retourner le nombre de pixels physiques (et qu'est-ce qu'un pixel sur un projecteur ?).

    Mais même si tu trouves quelque chose, ça ne t'aidera pas forcément si l'utilisateur n'a pas opté pour la résolution optimale. Sans parler de ses choix en matière de DPI... (qui sont des inches "logiques" et non "physiques")

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    261
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 261
    Par défaut
    Bonjour,
    Citation Envoyé par Andnotor Voir le message
    On ne connait pas les caractéristiques physiques de l'écran, on récupère tout au plus la résolution sélectionnée sur la carte graphique.
    Je veux bien admettre que les dimensions (hauteur, largeur en cm ou pouces) soient ignorées, mais ce n'est sûrement pas le cas de la définition (que certains dont Microsoft persistent à appeler à tort Résolution). Cette définition dépend des capacités de l'écran (et de la carte graphique) et est fixée lors du paramétrage de l'écran. La résolution en DPI tel qu'elle est utilisée par Microsoft est là pour faire un semblant de lien entre la définition et les dimensions supposées de l'écran. L'"Echelle" n'est que le ratio entre la résolution supposée de l'écran et 96 DPI.

    André

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. multi écran c++
    Par minnit_s dans le forum Windows
    Réponses: 6
    Dernier message: 04/06/2007, 11h07
  2. Création dynamique de forms & multi-écran
    Par ArkSquall dans le forum Langage
    Réponses: 14
    Dernier message: 09/05/2006, 09h36
  3. Multi-écrans
    Par Martin Guélat dans le forum Composants
    Réponses: 6
    Dernier message: 04/05/2006, 11h56
  4. Affichage plein écran en multi-écrans
    Par Martin Guélat dans le forum Périphériques
    Réponses: 4
    Dernier message: 12/04/2006, 11h20
  5. OpenGL et les cartes multi-écrans
    Par jcs2 dans le forum OpenGL
    Réponses: 1
    Dernier message: 14/02/2006, 14h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo