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

Composants VCL Delphi Discussion :

Le DPI scaling de Windows modifie le comportement du TMetaFile généré par TChart


Sujet :

Composants VCL Delphi

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 13
    Points : 18
    Points
    18
    Par défaut Le DPI scaling de Windows modifie le comportement du TMetaFile généré par TChart
    Bonjour à toutes et à tous,

    Voici mon souci :

    Lorsque l'on utilise la fonction TeeCreatemetafile de la classe TChart puis qu'on sauvegarde le TMetaFile dans un fichier,
    En affichage 100 % : on obtient une image correcte.
    En affichage 200 % : la taille de l'image (en pixel) est bien multiplié par 200 % en largeur et par 200 % en hauteur,
    mais l'image a la même taille d'origine et il y a simplement du blanc pour remplir l'espace supplémentaire.

    Comme disait Napoleon 2.0, un petit ASCII vaut mieux qu'un long discours :

    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
    24
    25
    26
     
    // J'ai représenté la taille de l'image par des tirets et le contenu de l'image elle même qui devrait être un visage.
     
    // Fichier image généré en affichage 100 %
    // ----------
    // |        |
    // |        |
    // |  o  o  |
    // |  ----  |
    // |        |
    // ----------
     
     
    // Fichier généré en affichage 200 %
    // --------------------
    // |                  |
    // |                  |
    // |  o  o            |
    // |  ----            |
    // |                  |
    // |                  |
    // |                  |
    // |                  |
    // |                  |
    // |                  |
    // --------------------
    Par contre si on utilise la fonction TeeCreateBitmap à la place de TeeCreatemetafile, le fichier est correctement enregistré. C'est à dire que le fichier image généré est le même en 100% qu'en 200%.

    Pouvez-vous m'éclaircir sur ce comportement ? Est-ce un paramétrage que j'ai oublié d'effectué ?
    Ou bien simplement un bug puisque le DPI scaling de Windows n'existait pas au moment de la publication de Delphi 6 ?

    Je vous remercie par avance, là je sèche

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 803
    Points : 13 493
    Points
    13 493
    Par défaut
    Tu peux toujours essayer de rendre ton application DPI Aware en ajoutant ceci dans le manifest :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
    	<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
    		<dpiAware>true</dpiAware>
    	</asmv3:windowsSettings>
    </asmv3:application>

    Si ça ne fonctionne pas, il faudra passer par un bitmap temporaire et utiliser son DC à la place de celui de l'écran.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 13
    Points : 18
    Points
    18
    Par défaut
    Merci beaucoup pour ce retour, je vais essayer

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 13
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Tu peux toujours essayer de rendre ton application DPI Aware en ajoutant ceci dans le manifest :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
    	<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
    		<dpiAware>true</dpiAware>
    	</asmv3:windowsSettings>
    </asmv3:application>

    Si ça ne fonctionne pas, il faudra passer par un bitmap temporaire et utiliser son DC à la place de celui de l'écran.
    Bonjour,

    Voici le .manifest que j'ai utilisé. Je l'ai nommé : NOM_DU_FICHIER.EXTENTION_DU_FICHIER.manifest

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
    	<asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
    		<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
    			<dpiAware>true</dpiAware>
    		</asmv3:windowsSettings>
    	</asmv3:application>
    </assembly>
    Lorsque je lance l'executable, je ne vois aucune différence.
    Par contre si je fais clic-droit + propriétés et que je coche Désactiver la mise à l'échelle[...] dans l'onglet Compatibilité alors cela résout mon souci !

    J'en conclu que j'ai du faire des fautes dans l'écriture de mon fichier manifest ? Ou que ma version de windows (10) ne supporte plus cette option du manifest ?

    Edit : Je ne peux pas utiliser de fichiers Bitmap à la place car le moteur d'impression que j'utilise va envoyer des images de tailles différentes suivant la résolution de l'imprimante :/

  5. #5
    Membre habitué
    Inscrit en
    Juillet 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2007
    Messages : 113
    Points : 170
    Points
    170
    Par défaut
    Je ne sais pas si ça existe sur Delphi 6 mais en Delphi 7, sur les Form il y a une propriété Scaled. En la passant à false, cela empêche l'action du zoom système.
    Si ton TChart est posé sur une TForm, il sera peut être impacté par cette propriété.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 13
    Points : 18
    Points
    18
    Par défaut
    Malheureusement, le programme développé avec Delphi pilote une fenêtre Windev. (Pas de TForm utilisé)
    Le programme utilise la classe TChart pour créer l'image à partir du TMetaFile généré puis l'envoi dans la fenêtre Windev.
    Et même, j'aurais le problème à l'impression car l'image que le TMetaFile génère est foireuse.

    Je vais orienter mes recherches pour faire fonctionner le fichier manifest, car lorsque je désactive manuellement la mise à l'échelle dans l'onglet compatibilité de Windows, le fichier image généré est nickel !

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 803
    Points : 13 493
    Points
    13 493
    Par défaut
    Ton manifest n'est pas complet, il faudrait au moins l'entête XML:
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
              <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="MonProg" type="win32"/>
     
              <description>Mon programme</description>
     
              <dependency>
                          <dependentAssembly>
    			<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
    		</dependentAssembly>
    	</dependency>
     
    	<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    		<security>
    			<requestedPrivileges>
    				<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
    			</requestedPrivileges>
    		</security>
    	</trustInfo>
     
    	<asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
    		<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
    			<dpiAware>true</dpiAware>
    		</asmv3:windowsSettings>
    	</asmv3:application>
     
    	<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    		<application>
    			<!-- Windows Vista -->
    			<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> 
     
    			<!-- Windows 7 -->
    			<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
     
    			<!-- Windows 8 -->
    			<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
     
    			<!-- Windows 8.1 -->
    			<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
     
    			<!-- Windows 10 -->
    			<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
    		</application>
    	</compatibility>
    </assembly>
    Passer par un fichier externe n'est possible que si l'application n'en contient pas du tout. Le manifest link-é est prioritaire.
    Je ne sait plus si D6 en générait déjà un...

  8. #8
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 13
    Points : 18
    Points
    18
    Par défaut
    Voilà je marque résolu la discussion :

    Le paramètre DPIAware du manifest est une Déclaration de la prise en charge DPI d'après l'aide d'embarcadero

    Dans mon cas, au contraire je devais la désactiver

    Alors, j'ai trouvé cette ligne de commande pour forcer la désactivation de la mise à l’échelle.
    Testé et approuvé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    // reg add "HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "<CheminExecutable>" /t REG_SZ /d "~ HIGHDPIAWARE" /f
    Merci à tous.

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

Discussions similaires

  1. Gosu : Window::Scale//Fullscreen
    Par MackValentine dans le forum Ruby
    Réponses: 1
    Dernier message: 30/08/2012, 15h29
  2. Changer le tcp window scale
    Par therealmancool dans le forum Windows XP
    Réponses: 0
    Dernier message: 27/04/2011, 12h31
  3. Documentation gratuite sur l'API Windows, COM, DCOM, OLE, etc.
    Par Community Management dans le forum Windows
    Réponses: 1
    Dernier message: 16/11/2006, 15h28
  4. Programme de boot qui passe la main à Windows
    Par Bob dans le forum Assembleur
    Réponses: 7
    Dernier message: 25/11/2002, 03h08
  5. Quel désassembleur/assembleur pour un exe Windows ?
    Par Anonymous dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 17/04/2002, 10h59

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