Vous êtes actuellement hors ligne, en attente de reconnexion à Internet.

Impossible d'agrandir des graphiques restitués par GDI+ au moyen des loupes d'écran

Le support de Windows XP a pris fin

Microsoft a mis fin au support de Windows XP le 8 avril 2014. Cette modification a affecté vos mises à jour logicielles et options de sécurité. Découvrez les implications de ce changement à votre niveau et la marche à suivre pour rester protégé.

Ancien nº de publication de cet article : F319261
Symptômes
Des graphiques restitués par GDI+ ne peuvent pas être agrandis au moyen des loupes d'écran. Ce problème affecte les programmes qui utilisent GDI+, notamment Microsoft Office XP, Microsoft Visio 2002, Microsoft .NET Framework et le shell Windows.
Cause
GDI+ utilise un mécanisme appelé DCI de restitution directe dans la mémoire tampon frontale. GDI+ ne génère pas d'appels GDI DDI lorsqu'il restitue de cette manière. Toutefois, les loupes d'écran fonctionnent en considérant que tous les rendus s'opèrent par le biais de GDI. Les loupes d'écran interceptent les appels GDI DDI, capturent tous les rendus dans une bitmap hors écran et tracent une partie de cette bitmap agrandie à l'écran.

Si une loupe écran est exécutée avec un programme qui utilise GDI+, certaines parties de l'écran voient leur tracé agrandi, tandis que d'autres ne le sont pas.
Résolution
Pour résoudre ce problème, récupérez la mise à jour qui est mentionnée dans l'article suivant de la Base de connaissances Microsoft :
318966 Problèmes de visualisation, de modification ou d'impression de certaines images dans Windows XP

Pour des développeurs de programmes

Si vous êtes un développeur de programmes, vous devez mettre votre programme à jour de sorte qu'il dise à GDI+ d'utiliser GDI à la place de DCI pour le rendu. Chaque instance GDI+ contient une fenêtre masquée de niveau supérieur dont le titre est "Fenêtre GDI+" et le nom de classe Classe de fenêtre d'interception GDI+. Lorsque vous installez la mise à jour décrite dans l'article Q318966, la fenêtre masquée GDI+ est à l'écoute d'un message de fenêtre privée portant le nom "Accessibilité GDI+". Si la fenêtre masquée GDI+ reçoit ce message, elle cesse d'utiliser DCI pour le rendu et démarre à la place l'utilisation de GDI. Ainsi, GDI+ fonctionne correctement avec des loupes d'écran.

Lors du chargement d'une loupe d'écran, celle-ci doit enregistrer un message de fenêtre privée nommée "Accessibilité GDI+". GDI+ enregistre un message privé portant le même nom, de sorte que la loupe peut utiliser ce message pour communiquer avec GDI+. La loupe peut alors analyser toutes les fenêtres de niveau supérieur existantes. Si la loupe trouve des fenêtres portant le nom "Fenêtre GDI+" et dont le nom de classe est Classe de fenêtre d'interception GDI+, la loupe doit envoyer le message "Accessibilité GDI+" à ces fenêtres. Ceci permet un agrandissement correct par tout programme GDI+ existant.

La loupe d'écran doit également guetter tous les nouveaux programmes GDI+ qui sont chargés après son démarrage. La loupe peut le faire en paramétrant une fonction de rappel à l'aide de SetWinEventHook qui est appelé chaque fois qu'une fenêtre est créée. Si une fenêtre est créée avec le titre et le nom de classe qui conviennent, la loupe doit lui envoyer le message "Accessibilité GDI+".

Notez qu'après une instance donnée de GDI+, débute l'utilisation de GDI à la place de DCI pour la restitution, le retour à DCI n'est pas possible à moins que le programme ne soit arrêté, puis redémarré. Le restitution de GDI+ à l'aide de GDI est plus lente qu'avec DCI. Si l'utilisateur n'a plus besoin d'une loupe avec GDI+ et souhaite accroître les performances du rendu, il peut alors redémarrer le programme GDI+.
Statut
Microsoft a confirmé l'existence de ce problème dans les produits Microsoft répertoriés dans la section "Liste des produits concernés par cet article".
Plus d'informations
Le programme suivant donné en exemple montre comment utiliser la nouvelle fonctionnalité GDI+ dans votre programme. Insérez les fichiers Gdipacs.c et Gdipacs.h dans votre projet. Vous devez appeler GDIPlusDCIOff_Init lorsque votre programme démarre. Ceci a pour effet d'arrêter le rendu à l'aide de DCI par tous les programmes GDI+ existants et d'interdire à tout nouveau programme GDI+ chargé, d'utiliser DCI pour la restitution. Vous devez appeler GDIPlusDCIOff_Uninit lorsque votre programme s'arrête. Des programmes GDI+ existants ne peuvent pas rétablir l'utilisation de DCI, toutefois les nouveaux programmes GDI+ utiliseront DCI comme ils font habituellement.

Le fichier Testmain.c présente cette fonctionnalité. Compilez et exécutez le fichier pour tester le message "Accessibilité GDI+" avec vos programmes GDI+.

Exemple de code

Microsoft fournit des exemples de programmation à des fins d'illustration uniquement, sans garantie explicite ou implicite, y compris, de manière non limitative, les garanties implicites de qualité marchande et/ou d'adéquation à un usage particulier. Cet article suppose que vous connaissez le langage de programmation présenté et les outils utilisés pour créer et déboguer des procédures. Les techniciens du Support technique Microsoft peuvent vous expliquer les fonctionnalités d'une procédure particulière, mais ils ne peuvent pas modifier les exemples en vue de vous fournir des fonctionnalités supplémentaires ou de créer des procédures répondant à vos besoins spécifiques. Si vous ne maîtrisez que partiellement la programmation, vous pouvez contacter un fournisseur de logiciels agréé Microsoft ou l'assistance téléphonique (payante) de Microsoft au (800) 936-5200 (États-Unis). Pour plus d'informations sur les fournisseurs de logiciels agréés Microsoft, veuillez consulter la page suivante sur le Web :Pour plus d'informations sur les options d'assistance disponibles auprès de Microsoft, veuillez consulter la page Web suivante :
/*********************** Module d'en-tête ************************\ * Nom du module : gdipacs.h** Copyright (c) 2002 Microsoft Corporation\**************************************************************/ /*  * Pour dire à GDI+ de cesser d'utiliser DCI : * Appelez GDIPlusDCIOff_Init comme faisant partie du démarrage de votre programme. * C'est un thread disposant d'une pompe de message qui doit l'appeler. * Avant de terminer, appeler GDIPlusDCIOff_Uninit sur ce * même thread pour le nettoyage. */ BOOL GDIPlusDCIOff_Init();VOID GDIPlusDCIOff_Uninit();/*********************** Module d'en-tête ************************\ * Nom du module : gdipacs.cpp** Copyright (c) 2002 Microsoft Corporation\**************************************************************/ // Nécessite WINVER 0x0500 pour récupérer les définitions pour WinEvents.// (ceci fonctionnera toujours avec Windows 95 et Windows NT 4.0 SP6).#define WINVER 0x0500#include <windows.h>#include "gdipacs.h"#define GDIPLUS_TITLE      TEXT("Fenêtre GDI+")#define GDIPLUS_CLASSNAME  TEXT("Classe de fenêtre d'interception GDI+")#define GDIPLUS_DCIOFFMSG  TEXT("Accessibilité GDI+")HWINEVENTHOOK ghWinEventHook = NULL;UINT gwmGdipMessage = 0;static BOOL IsGDIPlusWindow(HWND hwnd){    TCHAR str[MAX_PATH];     // Vérifie qu'une fenêtre est niveau supérieur et sans appartenance…     if(GetParent(hwnd) != NULL)          return FALSE;     // Vérifie le nom de classe de la fenêtre    if(GetClassName(hwnd, str, MAX_PATH) == 0     || lstrcmp(str, GDIPLUS_CLASSNAME) != 0)          return FALSE;     // Vérifie le titre de la fenêtre…    if(GetWindowText(hwnd, str, MAX_PATH) == 0      || lstrcmp(str, GDIPLUS_TITLE) != 0)          return FALSE;     return TRUE;}static VOID SendDCIOFFMessage(HWND hwnd){    SendMessage(hwnd, gwmGdipMessage, 0, 0);    #ifdef _DEBUG     {          TCHAR strDebug[MAX_PATH];          // Pour des besoins de débogage, handle de sortie pointant vers une fenêtre masquée.          wsprintf(               strDebug,               TEXT("Sent GDI+ Message: HWND=%08x\n"),               hwnd);          OutputDebugString(strDebug);     }#endif}static BOOL CALLBACK WndEnumProc(    HWND hwnd,    LPARAM lParam    ){     if(IsGDIPlusWindow(hwnd))     {          SendDCIOFFMessage(hwnd);    }    return TRUE;}VOID CALLBACK WindowCreateProc(    HWINEVENTHOOK hWinEventHook,    DWORD event,    HWND hwnd,    LONG idObject,    LONG idChild,    DWORD dwEventThread,    DWORD dwmsEventTime    ){    if (idObject == OBJID_WINDOW && IsGDIPlusWindow(hwnd))     {          SendDCIOFFMessage(hwnd);    }}BOOL GDIPlusDCIOff_Init(){     if(ghWinEventHook != NULL)          return FALSE;     // Enregistre le message "Arrêt de DCI"    gwmGdipMessage = RegisterWindowMessage(GDIPLUS_DCIOFFMSG);    if (gwmGdipMessage == 0)    {        return FALSE;    }     // Définit une interception pour guetter la création de fenêtres…    ghWinEventHook = SetWinEventHook(        EVENT_OBJECT_CREATE,        EVENT_OBJECT_CREATE,        NULL,        WindowCreateProc,        0,        0,        WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS);    if (ghWinEventHook == NULL)    {        return FALSE;    }     // Analyse les fenêtres existantes…    EnumWindows(WndEnumProc, 0);     return TRUE;}VOID GDIPlusDCIOff_Uninit(){     if(ghWinEventHook != NULL)     {         UnhookWinEvent(ghWinEventHook);          ghWinEventHook = NULL;     }}/*********************** Module d'en-tête ************************\ * Nom du module : testmain.c** Copyright (c) 2002 Microsoft Corporation\**************************************************************/ /*  * Exemple de programme qui montre l'utilisation de GDIPACS.h pour que * GDI+ cesse d'utiliser DCI */ #include <windows.h>#include "gdipacs.h"#define TITLE TEXT("Désactivation de DCI GDI+")int WINAPIWinMain( HINSTANCE  hInstance,         HINSTANCE  hPrevInstance,         LPSTR      szCmdLine,          int        nCmdShow ){     MessageBox(NULL,TEXT("Cliquez sur OK pour démarrer la désactivation de l'utilisation de DCI..."), TITLE, MB_OK);     /*      * GDIPlusDCIOff_Init() doit être appelé à partir d'un thread qui pompe      * des messages - en somme, le thread UI principal. Dans cet exemple, les      * appels MessageBox contiennent des pompes de messages. Un programme véritable      * aurait probablement sa propre boucle GetMessage().      */      if( ! GDIPlusDCIOff_Init() )     {          MessageBox(NULL,TEXT("GDIPlusDCIOff_Init() a échoué"), TITLE, MB_OK);          return 0;     }     MessageBox(NULL,TEXT("DCI est maintenant arrêté dans tous les programmes GDI+ existants. Cliquez sur OK pour réactiver DCI…"), TITLE, MB_OK);     GDIPlusDCIOff_Uninit();          MessageBox(NULL,TEXT("DCI reste arrêté dans tous les programmes GDI+, mais sera réactivé pour le démarrage de nouveaux programmes. Cliquez sur OK pour quitter cet exemple."),     TITLE, MB_OK);    return 0;}
accessibility tool screen magnifier GDI+
Propriétés

ID d'article : 319261 - Dernière mise à jour : 11/23/2006 07:43:51 - Révision : 2.1

  • Microsoft Windows XP Édition familiale
  • Microsoft Windows XP Professionnel
  • kbbug kbfix kbwinxppresp1fix kbwinxpsp1fix KB319261
Commentaires