Partage
  • Partager sur Facebook
  • Partager sur Twitter

C++ - Récupérer le facteur de redimensionnement

Sujet résolu
    12 octobre 2020 à 17:44:32

    Bonjour,

    Actuellement je travaille avec un écran 4K, et je cherche à récupérer le facteur de redimensionnement Windows afin de pouvoir modifier mes icônes et d'avoir un bien meilleur rendu.

    J'ai trouvé divers solutions sur le net, dont la plus répandue qui est de comparer les coordonnées physiques et logiques de l'écran. Mais j'ai eu la surprise d'obtenir à chaque

    fois un facteur de redimensionnement égal à 1 (alors que je devrais trouver 1.50 car je suis à 150%).

    Auriez-vous des pistes afin de contourner/solutionner ce problème ?

    Ps: Je cherche une solution Windows en priorité (même si je suis preneur d'une solution multi plateforme, juste par curiosité !) :)

    Merci ! :)

    • Partager sur Facebook
    • Partager sur Twitter
      12 octobre 2020 à 19:09:38

      Les physical/logical resolutions correspondent plutot a des caractéristiques des écrans et de leur management par le système. Par exemple, sur Retina, c'est un ratio de 2. Aucun rapport avec le redimensionnement.

      Peut etre  https://docs.microsoft.com/en-us/windows/win32/api/shtypes/ne-shtypes-device_scale_factor ? Mais je ne connais pas les termes exactes utilisés par Windows. Il faut lire la doc pour trouver les termes que Windows a choisi d'utiliser puis voir les API pour savoir comment récupérer ce paramètre.

      C'est le bordel :)

      • Partager sur Facebook
      • Partager sur Twitter
        13 octobre 2020 à 9:26:30

        Salut !
        Ah d'accord ... je pensais que les coordonnées physiques correspondaient vraiment aux coordonnées physiques de l'écran ... et que la division avec les coordonnées logiques retournerait le facteur de redimensionnement Windows.
        J'ai déjà testé cette méthode, et elle me retourne toujours 100%, donc un facteur de redimensionnement de 1 ! :(
        J'ai lu dans la doc, que lorsqu'on est dans le contexte d'une application Windows, on travaille avec des coordonnées déjà "redimensionnées". D'où l'impossibilité de récupérer le bon facteur de redimensionnement ... par exemple dans mon cas, pour de nouveau travailler avec les coordonnées originales, il existe deux méthodes :
        - Utiliser une méthode nommé "SetProcressDpiAwarenessContext", mais la doc Windows ne conseille pas d'utiliser cette méthode (WTF ???)
        - Modifier le manifeste généré par visual studio lors de l'édition de lien ..... mais ce manifeste est généré à l'édition de lien et donc détruit et recréer à chaque compilation ...
        C'est très étrange !
        Par contre si je créé un nouveau projet en mode "console", la méthode avec les coordonnées physiques et logiques fonctionnent, et je récupère le bon facteur de redimensionnement.
        J'ai donc pensé à une éventuelle solution, établir une communication entre mon logiciel et un petit .exe en mode console qui ne s'occupera que de récupérer le facteur de redimensionnement et de l'envoyer par une pipe au programme principal. Que pensez-vous de cette solution ?
        Merci ! :)

        -
        Edité par Toniooo 13 octobre 2020 à 9:26:56

        • Partager sur Facebook
        • Partager sur Twitter
          13 octobre 2020 à 10:56:47

          >SetProcressDpiAwarenessContext

          Il n'y a pas de WTF, dans "SetProcressDpiAwarenessContext", il y a "Set", c'est une primitive pour MODIFIER un des paramètre d'exécution du processus, et c'est bien plus simple et gérable de coller ce genre de bidule dans le manifeste de l'exécutable, pour que le loader du système fasse correctement le boulot.

          Il faut quand même lire et comprendre un minimum la documentation (voire juste comprendre les conventions de nommage ;)) et pas imaginer des choses.

          Donc, configurez correctement votre manifeste et les API de consultation (avec des "Get", un ;)) devraient vous donnez des résultats plus conformes à vos attentes.

          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
            13 octobre 2020 à 11:16:22

            Donc si je comprend bien, il existe un manifeste crée/édité lors de l'édition de lien pendant la compilation (qui est réinitialisé à chaque compilation), et moi je dois créé un nouveau manifeste que je vais lier avec l'application ?
            • Partager sur Facebook
            • Partager sur Twitter
              13 octobre 2020 à 12:31:01

              Le manifeste est généralement DANS l'exécutable, exactement comme une ressource, qui contiennent déjà l'icône de l'exécutable, le numéro de version etc...

              Le manifeste, c'est une ressource comme une autre ( il existe des moyens pour l'externaliser, je crois, mais il n'y pas vraiment d'intérêt à cela).

              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                13 octobre 2020 à 14:27:07

                Ah d'accord, c'est donc manipulable depuis l'onglet "gestionnaire de ressource" de visual studio ! Merci, je vais jeter un coup d'œil vers cette piste ! :)
                • Partager sur Facebook
                • Partager sur Twitter
                  13 octobre 2020 à 14:54:07

                  C'est "fourré" dans l'exécutable exactement comme une ressource, mais il y a quand même plus pratique qu'un éditeur d'icône ou de stringTable pour ça. :lol:

                  https://docs.microsoft.com/fr-fr/cpp/build/how-to-embed-a-manifest-inside-a-c-cpp-application?view=vs-2019

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                    13 octobre 2020 à 17:26:41

                    Super merci ça fonctionne ! :)
                    Pour les gens qui passeront sur ce sujet en se posant la même question :
                    1) Créer un fichier test.manifest avec le contenu suivant :
                    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
                    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
                      <application xmlns="urn:schemas-microsoft-com:asm.v3">
                        <windowsSettings>
                          <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
                        </windowsSettings>
                      </application>
                    </assembly>
                    Bien évidemment, remplacez le 'test' par ce que vous souhaitez !
                    2) Ajouter ce fichier manifeste dans les fichiers manifestes supplémentaires :
                    Dans visual studio -> Propriétés -> Outil Manifeste -> Entrée et sortie -> Ajouter le chemin de votre fichier dans 'Fichiers manifeste supplémentaires'
                    3) Pour tester, je vous conseille de réaliser cette manipulation afin de vérifier que le manifeste généré à l'édition de lien et votre manifeste sont bien fusionnés :
                    Dans visual studio -> Propriétés -> Outil Manifetse -> Entrée et sortie -> Fichier manifeste de sortie -> Non
                    4) Générer votre projet, ensuite vérifier que le manifeste généré par Visual Studio comporte bien les éléments de votre manifeste
                    5) Retourner inclure votre manifeste à votre .exe ou .dll
                    Dans visual studio -> Propriétés -> Outil Manifetse -> Entrée et sortie -> Fichier manifeste de sortie -> Oui
                    Voilà, ça fonctionne, le facteur de redimensionnement récupéré est bien le bon ! :)
                    • Partager sur Facebook
                    • Partager sur Twitter

                    C++ - Récupérer le facteur de redimensionnement

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown