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

Langage Delphi Discussion :

Police système différente entre D7 et D10


Sujet :

Langage Delphi

  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2004
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 98
    Par défaut Police système différente entre D7 et D10
    Bonjour. Je viens de découvrir que le même code pour lire la police système ne me retourne pas ma même valeur suivant que je compile sous D7 ou sous D10.2.
    Le code est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var 
        dc:HDC;
        result:integer;
    begin
        dc:=GetDC(0);
        result:=GetDeviceCaps(dc,LOGPIXELSX);
        ReleaseDC(0,dc);
        ....
    end;
    Si mes paramètres d'affichage Windows (Windows10) sont à 100%, pas de souci, les deux compilations me renvoient result=96 (normal).
    Si je passe à 125% en paramètre d'affichage, la compilation D7 me renvoie toujours 96 (???) et la compilation D10 me renvoie 120 (normal).
    Une idée ?
    Gab

  2. #2
    Membre chevronné Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chambord
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 184
    Par défaut
    La raison est que Delphi 10.2 prend en compte le DPI, je penses !

  3. #3
    Membre confirmé
    Inscrit en
    Novembre 2004
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 98
    Par défaut
    Peut-être que la fonction utilisée n'est pas la bonne ?
    Ce que je souhaite c'est récupérer le réglage Ecran de Windows qui change la taille du texte, des applications et autres éléments.
    Ce paramètre est affiché comme 100% (recommandé), 125%, 150%.
    Il semble que la fonction getDeviceCaps et LOGPIXELSX ne renvoient pas ce paramètre de Windows, tout du moins pour D7.
    j'ai essayé avec screen.pixelperinch mais ça me renvoie les mêmes valeurs, 96 avec D7 et 120 avec D10 si je suis à 125%.
    Quelle fonction me donne la valeur de ce réglage de Windows ?

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 988
    Par défaut
    C'est un problème de manifeste, l'application doit se déclarer DPI-aware pour recevoir des valeurs correctes. En son absence c'est l'OS qui procède à une mise à l'échelle sur la base de 96 dpi.
    Il n'y avait pas encore cette notion à l'époque D7, il faut l'ajouter soi-même en ressource.

    L'essai est vite fait, sous D10 compile sans manifeste et la valeur retournée sera aussi 96.

  5. #5
    Membre confirmé
    Inscrit en
    Novembre 2004
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 98
    Par défaut
    Merci pour l'explication. Je vais approfondir .

  6. #6
    Membre expérimenté
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 633
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par f6dqm1 Voir le message
    Merci pour l'explication. Je vais approfondir .
    D7 : pas DPI‑aware : Windows renvoie toujours 96.
    D10.2 : DPI‑aware : Windows renvoie la vraie valeur (120 à 125%).

    Donc ton code est correct, c’est juste la différence de manifeste et de gestion DPI entre les deux compilateurs.

    Si tu veux que ton programme D7 se comporte comme celui en D10.2 :
    Ajoute un manifeste qui déclare ton appli comme DPI‑aware (<dpiAware>true</dpiAware>).

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
      <application>
        <windowsSettings>
          <!-- Déclare l'application comme DPI-aware -->
          <dpiAware>true</dpiAware>
          <!-- Pour Windows 10 et +, tu peux aussi utiliser : -->
          <!-- <dpiAwareness>PerMonitorV2</dpiAwareness> -->
        </windowsSettings>
      </application>
    </assembly>
    On ne peut pas faire confiance à un code qu'on n'a pas entièrement écrit soi‑même, et encore moins à celui qu'on a écrit entièrement. :aie:

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 988
    Par défaut
    Citation Envoyé par XeGregory Voir le message
    Si tu veux que ton programme D7 se comporte comme celui en D10.2
    Au niveau des informations retournées, sinon ce n'est pas aussi simple que ça.

    Les composants dérivant de TWinControl peuvent être automatiquement adaptés (rendu mais pas positionnement) alors que ceux dérivant de TControl devront être entièrement recalculés.
    Et PerMonitor(V2) ajoute une couche lors du déplacement de la fenêtre sur un écran secondaire pour une mise à l'échelle dynamique.

    Bon courage pour refaire tout ça en D7

    Note: le manifeste proposé par XeGregory montre juste les réglages DPI-Awarness. Il faudra le compléter sous peine de se retrouver avec un look à la Windows 2000.

  8. #8
    Membre expérimenté
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 633
    Billets dans le blog
    1
    Par défaut
    Bon courage pour refaire tout ça en D7
    On ne peut pas faire confiance à un code qu'on n'a pas entièrement écrit soi‑même, et encore moins à celui qu'on a écrit entièrement. :aie:

  9. #9
    Membre confirmé
    Inscrit en
    Novembre 2004
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 98
    Par défaut
    J'ai essayé le manifeste de XeGregory .
    Création fichier dpiaware.manifest avec le code xml fourni.
    fichier rc avec une seule ligne : "1 24 dpiaware.manifest"
    Compilation en fichier res sans erreur.
    directive $R xxx.res dans l'application D7
    Compilation sans erreur
    Exécution interrompue avec le message suivant (voir image).
    Images attachées Images attachées  

  10. #10
    Membre chevronné Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chambord
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 184
    Par défaut
    Et que dit le journal d’évènement ?

    Je ne suis pas un expert, mais dans le manifest, la balise Application, ne dois pas se trouver dans la balise Compatibility ?

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 988
    Par défaut
    Un manifeste actuel complet serait comme ceci :
    Code xml : 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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
      <asmv3:application>
        <asmv3:windowsSettings>
          <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware>
          <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
        </asmv3:windowsSettings>
      </asmv3:application>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            publicKeyToken="6595b64144ccf1df"
            language="*"
            processorArchitecture="*"/>
        </dependentAssembly>
      </dependency>
      <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
          <requestedPrivileges>
            <requestedExecutionLevel
              level="asInvoker"
              uiAccess="false"
            />
          </requestedPrivileges>
        </security>
      </trustInfo>
      <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
        <application>
          <!--The ID below indicates app support for Windows Vista -->
          <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
          <!--The ID below indicates app support for Windows 7 -->
          <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
          <!--The ID below indicates app support for Windows 8 -->
          <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
          <!--The ID below indicates app support for Windows 8.1 -->
          <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
          <!--The ID below indicates app support for Windows 10 -->
          <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
        </application>
      </compatibility>
    </assembly>

    Le manifeste est stocké tel-quel en ressource. On peut le récupérer d'un exe compilé en D10 par un éditeur de ressource ou même simplement en ouvrant l'exe dans un éditeur de texte (notepad++, chercher uiAccess ou dpiAwareness)

    On pourrait aussi l'extraire depuis une app :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if FindResource(UnModuleHandle, MakeIntResource(1), RT_MANIFEST) <> 0 then
      Resource := TResourceStream.CreateFromID(UnModuleHandle, 1, RT_MANIFEST);

  12. #12
    Membre confirmé
    Inscrit en
    Novembre 2004
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 98
    Par défaut
    Merci pour cette version de manifeste.
    Elle fonctionne correctement dans la compilation D7 et la valeur DPI est maintenant bien la même que celle renvoyée par la compilation D10 (96 pour 100% et 120 pour 125% de mise à l'échelle dans les réglages Windows).
    J'avoue que j'ai bêtement recopié le code xml car je n'y connais pas grand-chose.
    En tous les cas, ça à l'air de marcher !
    Peut-être que cela pourra servir à d'autres ?

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 19/10/2017, 20h01
  2. Police email de + en + grand entre lotus et outlook
    Par Dung-Tri dans le forum Outlook
    Réponses: 1
    Dernier message: 23/10/2008, 22h07
  3. Taille de polices identique entre IE et FF ?
    Par tintin72 dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 11/02/2008, 20h09
  4. Réponses: 1
    Dernier message: 05/01/2008, 20h15
  5. Différence de police entre plusieurs postes
    Par Bruno13 dans le forum Delphi
    Réponses: 13
    Dernier message: 19/04/2007, 18h13

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