Grafiken, die von GDI + gerendert werden können nicht durch Bildschirmvergrößerer vergrößert werden

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 319261 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Auf dieser Seite

Problembeschreibung

Grafiken, die von GDI + dargestellt werden können nicht durch Bildschirmvergrößerer vergrößert. Dieses Problem betrifft alle Programm, das GDI +, einschließlich Microsoft Office XP, Microsoft Visio 2002, Microsoft .NET Framework und die Windows-Shell verwendet.

Ursache

GDI + verwendet einen Mechanismus mit dem Namen DCI direkt in den Frontpuffer zu rendern. GDI + erzeugt GDI-DDI-Aufrufe keine Wenn Sie auf diese Weise rendert. Allerdings funktionieren Bildschirmvergrößerer durch vorausgesetzt, dass alle Rendering über GDI auftritt. Bildschirmvergrößerer verknüpfen die GDI-DDI-Aufrufe, erfassen alle in eine offscreen-Bitmap Rendern und zeichnen einen Teil der Bitmap, die auf dem Bildschirm vergrößert.

Wenn eine Bildschirmlupe mit einem Programm ausgeführt, die GDI + verwendet wird, einige Teile des Bildschirms werden vergrößerten gezeichnet, und einige Teile unmagnified gezeichnet werden.

Lösung

Installieren Sie das neueste Service Pack für Windows XP, um dieses Problem zu beheben. Weitere Informationen finden Sie die folgende KB-Artikelnummer:
322389Wie Sie das neueste Service Pack für Windows XP erhalten
Beziehen Sie um dieses Problem zu beheben, das im folgenden Artikel der Microsoft Knowledge Base erwähnte Update:
318966Probleme beim Anzeigen, Bearbeiten oder Drucken einiger Bilder in Windows XP

Für Programm-Entwickler

Wenn Sie ein Programmentwickler sind, müssen Sie das Programm aktualisieren, so dass es GDI + GDI anstelle von DCI für die Wiedergabe verwenden teilt. Jede GDI +-Instanz enthält ein ausgeblendetes Fenster der obersten Ebene, dessen Titel "GDI + Fenster" und deren Klassennamen ist GDI + Häkchen Fensterklasse . Bei der Installation beschriebene Update in Artikel Q318966, überwacht das ausgeblendete Fenster GDI + eine private Fenstermeldung mit dem Namen "GDI + Eingabehilfen". Wenn das ausgeblendete Fenster GDI + dieser Nachricht empfängt, wird es beendet DCI für Rendering verwenden und startet GDI verwenden. Auf diese Weise GDI + mit Bildschirmvergrößerer richtig funktionieren.

Wenn eine Bildschirmlupe lädt, müssen Sie eine private Fenstermeldung registrieren mit dem Namen "GDI + Eingabehilfen". GDI + registriert eine private Meldung mit dem gleichen Namen, damit der Bildschirmlupe mit GDI + kommunizieren kann, mithilfe dieser Nachricht. Die Bildschirmlupe muss anschließend alle vorhandenen auf höchster Ebene stehende Fenster scannen. Findet der Bildschirmlupe alle Fenster, heißen "GDI + Fenster" und deren Klassenname ist GDI + Häkchen Fensterklasse , muss der Bildschirmlupe die Meldung "GDI + Accessibility" an diese Fenster senden. Dadurch werden alle vorhandenen GDI +-Programme korrekt zu vergrößern.

Die Bildschirmlupe muss auch für alle neuen GDI +-Programme achten, die nach dem Start geladen werden. Die Bildschirmlupe erreichen dies durch Festlegen einer Rückruffunktion mithilfe von SetWinEventHook , die aufgerufen wird jedes Mal ein neues Fenster erstellt wird. Wenn ein neues Fenster mit den richtigen Titel und Klassennamen erstellt wird, muss der Bildschirmlupe "GDI + Accessibility" Nachricht zu senden.

Beachten Sie, dass nach eine bestimmte Instanz von GDI + mit GDI statt DCI zum Rendern, es kann nicht wieder auf umschalten DCI, wenn das Programm beenden und neu gestartet. GDI + rendert mithilfe von GDI als mithilfe von DCI langsamer. Wenn der Benutzer nicht mehr eine Bildschirmlupe mit GDI benötigt + und Renderingleistung erhöhen möchte, kann der Benutzer die GDI +-Anwendung neu starten.

Status

Microsoft hat bestätigt, dass es sich hierbei um ein Problem bei den in diesem Artikel genannten Microsoft-Produkten handelt. Dieses Problem wurde erstmals in Windows XP Service Pack 1.

Weitere Informationen

Das folgende Beispielprogramm veranschaulicht, wie die neue GDI +-Funktionalität in Ihrem Programm verwendet. Die Gdipacs.c und Gdipacs.h Dateien in Ihr Projekt einschließen. Sie müssen GDIPlusDCIOff_Init aufrufen, wenn Ihr Programm wird gestartet. Dadurch werden alle vorhandenen GDI + Programme nicht mehr mithilfe von DCI Rendern und veranlasst das alle neuen GDI +-Programme, die nicht mit DCI Rendern geladen werden. Sie müssen GDIPlusDCIOff_Uninit aufrufen, wenn das Programm beendet wird. Vorhandene Programme GDI + können nicht wieder DCI, neue GDI + Programme DCI verwenden, wie in der Regel jedoch.

Die Datei Testmain.c wird diese Funktionalität veranschaulicht. Kompilieren Sie und führen Sie die Datei so testen Sie die Meldung "GDI + Accessibility" mit Ihren Programmen GDI +.

Beispielcode

Microsoft bietet Programmierbeispiele für Abbildung nur ohne Gewährleistung oder konkludent, einschließlich, aber nicht beschränkt auf konkludenten Garantien der Handelsüblichkeit und/oder Eignung für einen bestimmten Zweck. Die zur Verfügung gestellten Makro- und Programmierungsbeispiele sollen lediglich exemplarisch die Funktionsweise des Beispiels aufzeigen. Spezialisten von Microsoft Support Services können bei Erläuterung die Funktionalität einer bestimmten Prozedur helfen, Sie werden ändert jedoch nicht Beispielen bieten Funktionen hinzugefügt oder Verfahren, um Ihren speziellen Anforderungen erstellen.
Wenn Sie Programmiererfahrung, beschränkt haben, sollten Sie ein Microsoft Certified Partner oder die Microsoft Advisory Services wenden. Weitere Informationen finden Sie auf diese Websites von Microsoft:

Microsoft Certified Partner - https://partner.microsoft.com/global/30000104

Microsoft-Sicherheitsempfehlung Services - http://support.microsoft.com/gp/advisoryservice

Weitere Informationen zu den Supportoptionen, die verfügbar sind und wie Sie Microsoft kontaktieren besuchen Sie in der folgenden Website: http://support.microsoft.com/default.aspx?scid=fh;EN-US;CNTACTMS
/*********************** Module*Header ************************\ 
* Module Name: gdipacs.h
*
* Copyright (c) 2002 Microsoft Corporation
\**************************************************************/ 

/* 
 * To tell GDI+ to stop using DCI:
 * Call GDIPlusDCIOff_Init as part of your program startup.
 * This must be called by a thread that has a message pump.
 * Before terminating, call GDIPlusDCIOff_Uninit on that
 * same thread to clean up.
 */ 

BOOL GDIPlusDCIOff_Init();
VOID GDIPlusDCIOff_Uninit();




/*********************** Module*Header ************************\ 
* Module Name: gdipacs.cpp
*
* Copyright (c) 2002 Microsoft Corporation
\**************************************************************/ 

// Need WINVER 0x0500 to get the definitions for WinEvents.
// (They will still work on Windows 95 and Windows NT 4.0 SP6.)
#define WINVER 0x0500
#include <windows.h>
#include "gdipacs.h"


#define GDIPLUS_TITLE      TEXT("GDI+ Window")
#define GDIPLUS_CLASSNAME  TEXT("GDI+ Hook Window Class")
#define GDIPLUS_DCIOFFMSG  TEXT("GDI+ Accessibility")


HWINEVENTHOOK ghWinEventHook = NULL;
UINT gwmGdipMessage = 0;


static BOOL IsGDIPlusWindow(HWND hwnd)
{
    TCHAR str[MAX_PATH];

     // Check that window is top-level and unowned...
     if(GetParent(hwnd) != NULL)
          return FALSE;

     // Check window class name...
    if(GetClassName(hwnd, str, MAX_PATH) == 0
     || lstrcmp(str, GDIPLUS_CLASSNAME) != 0)
          return FALSE;

     // Check window title...
    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];

          // For debug purposes, output handle to hidden window.
          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;

     // Register the "turn off DCI" message...
    gwmGdipMessage = RegisterWindowMessage(GDIPLUS_DCIOFFMSG);
    if (gwmGdipMessage == 0)
    {
        return FALSE;
    }

     // Set a hook to watch for new windows being created...
    ghWinEventHook = SetWinEventHook(
        EVENT_OBJECT_CREATE,
        EVENT_OBJECT_CREATE,
        NULL,
        WindowCreateProc,
        0,
        0,
        WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS);
    if (ghWinEventHook == NULL)
    {
        return FALSE;
    }

     // Scan through existing windows...
    EnumWindows(WndEnumProc, 0);

     return TRUE;
}

VOID GDIPlusDCIOff_Uninit()
{
     if(ghWinEventHook != NULL)
     {
         UnhookWinEvent(ghWinEventHook);
          ghWinEventHook = NULL;
     }
}


/*********************** Module*Header ************************\ 
* Module Name: testmain.c
*
* Copyright (c) 2002 Microsoft Corporation
\**************************************************************/ 

/* 
 * Sample program that demonstrates using GDIPACS.h to turn off
 * the GDI+ use of DCI.
 */ 

#include <windows.h>
#include "gdipacs.h"

#define TITLE TEXT("GDI+ DCI Disabler")

int WINAPI
WinMain( HINSTANCE  hInstance,
         HINSTANCE  hPrevInstance,
         LPSTR      szCmdLine, 
         int        nCmdShow )
{
     MessageBox(NULL,TEXT("Click OK to start disabling use of DCI..."), TITLE, MB_OK);

     /*
      * GDIPlusDCIOff_Init() must be called from a thread that pumps
      * messages - typically the main UI thread. In this sample, the
      * MessageBox calls contain message pumps. A real-world program
      * likely has its own GetMessage() loop instead.
      */ 
     if( ! GDIPlusDCIOff_Init() )
     {
          MessageBox(NULL,TEXT("GDIPlusDCIOff_Init() failed"), TITLE, MB_OK);
          return 0;
     }

     MessageBox(NULL,TEXT("DCI is now turned off in all existing GDI+ programs. Click OK to turn on DCI again..."), TITLE, MB_OK);

     GDIPlusDCIOff_Uninit();
     
     MessageBox(NULL,TEXT("DCI remains turned off in all existing GDI+ programs, but will be turned on for new programs that start. Click OK to exit this sample."), TITLE, MB_OK);

    return 0;
}
				

Eigenschaften

Artikel-ID: 319261 - Geändert am: Montag, 21. Mai 2007 - Version: 4.7
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft .NET Framework 1.0, wenn verwendet mit:
    • the operating system: Microsoft Windows XP
  • Microsoft GDI+ 1.0, wenn verwendet mit:
    • the operating system: Microsoft Windows XP
  • Microsoft Office XP, wenn verwendet mit:
    • the operating system: Microsoft Windows XP
  • Microsoft Visio 2002 Professional Edition, wenn verwendet mit:
    • the operating system: Microsoft Windows XP
  • Microsoft Visio 2002 Standard Edition, wenn verwendet mit:
    • the operating system: Microsoft Windows XP
Keywords: 
kbmt kbbug kbfix kbshell kbwinxpsp1fix KB319261 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 319261
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com