Gli elementi grafici che sono rendering da GDI + Impossibile essere ingranditi, ingrandimento dello schermo

Traduzione articoli Traduzione articoli
Identificativo articolo: 319261 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

Sintomi

Elementi grafici che vengono eseguito il rendering da GDI + non possono essere ingranditi, ingrandimento dello schermo. Questo problema riguarda un programma che utilizza GDI +, tra cui Microsoft Office XP, Microsoft Visio 2002, Microsoft .NET Framework e la shell di Windows.

Cause

GDI + viene utilizzato un meccanismo è denominato DCI per il rendering direttamente in un front buffer. GDI + non genera chiamate GDI DDI viene eseguito il rendering in questo modo. Tuttavia, ingrandimento dello schermo funziona da supponendo che il rendering di tutte le avviene tramite GDI. Ingrandimento dello schermo associare le chiamate di GDI DDI, acquisizione tutte rendering in una bitmap fuori schermata e disegna una parte di tale bitmap ingrandita sullo schermo.

Se una lente di ingrandimento dello schermo viene eseguito con un programma che utilizza GDI +, alcune parti dello schermo vengono disegnate ingrandita e alcune parti vengono disegnate unmagnified.

Risoluzione

Per risolvere il problema, procurarsi l'ultimo service pack per Windows XP. Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
322389Come ottenere Windows XP Service Pack più recente
Per risolvere questo problema, è necessario scaricare l'aggiornamento menzionato nell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
318966Problemi di visualizzazione, modifica o stampa di immagini in Windows XP

Per gli sviluppatori di programmi

Se si è uno sviluppatore di programma, è necessario aggiornare il programma in modo che indica GDI + per l'utilizzo di GDI anziché DCI per il rendering. Ciascuna istanza GDI + contiene una finestra nascosta principale cui titolo è "finestra per GDI +" e la cui nome di classe è la Classe per la finestra di hook GDI + . Quando si installa l'aggiornamento descritto nell'articolo Q318966, finestra nascosta GDI + attende un messaggio per finestra privata è denominato "GDI + accesso facilitato." Se la finestra nascosta di GDI + riceve questo messaggio, interrompe utilizzando DCI per rendering e inizia a utilizzare invece GDI. In questo modo funzionano correttamente con ingrandimento dello schermo in GDI +.

Quando viene caricata una lente di ingrandimento dello schermo, è necessario registrare un messaggio per finestra privata è denominato "GDI + accesso facilitato." GDI + registrato un messaggio privato lo stesso nome, in modo che l'ingrandimento grado di comunicare con GDI + utilizzando questo messaggio. L'ingrandimento deve quindi analizzare tutte le finestre di primo livello esistenti. Se l'ingrandimento rileva tutte le finestre che sono denominati "finestra per GDI +" e il cui nome di classe è la Classe per la finestra di hook GDI + , è necessario che l'ingrandimento inviare il messaggio di "accesso facilitato GDI +" tali finestre. In questo modo le applicazioni GDI + esistente ingrandire correttamente.

L'ingrandimento dello schermo deve controllare anche i nuovi programmi GDI + che vengono caricati dopo l'avvio. Per l'ingrandimento farlo impostando una funzione di callback utilizzando SetWinEventHook viene chiamato ogni volta che viene creata una nuova finestra. Se con il titolo corretto e il nome di classe viene creata una nuova finestra, è necessario che l'ingrandimento inviare il messaggio di "accesso facilitato GDI +" a esso.

Si noti che dopo una determinata istanza di GDI +, inizia a utilizzare GDI anziché DCI per eseguire il rendering, Impossibile passare al utilizzando DCI a meno che il programma sia chiuso e riavviato. GDI + il rendering più lentamente utilizzando GDI rispetto a utilizzando DCI. Se l'utente non richiede una lente di ingrandimento con GDI + e desidera aumentare le prestazioni di rendering, l'utente può riavviare il programma GDI +.

Status

Microsoft ha confermato che questo problema riguarda i prodotti Microsoft elencati all'inizio di questo articolo. Questo problema è stato corretto per la prima volta nel Service Pack 1 per Windows XP.

Informazioni

Il programma di esempio riportato di seguito viene illustrato come utilizzare la nuova funzionalità GDI + in un programma. Includere i file Gdipacs.c e Gdipacs.h nel progetto. È necessario chiamare GDIPlusDCIOff_Init quando viene avviato il programma. In questo modo tutti i programmi GDI + esistenti per interrompere il rendering utilizzando DCI e imposta i nuovi programmi GDI + che vengono caricati di non per utilizzare DCI per eseguire il rendering. È necessario chiamare GDIPlusDCIOff_Uninit quando si chiude il programma. Impossibile ripristinare utilizzando DCI programmi esistenti di GDI +, ma nuovi GDI + programmi utilizzeranno DCI come avviene in genere.

Il file Testmain.c viene illustrata questa funzionalità. Compilare ed eseguire il file per verificare il messaggio "accesso facilitato GDI +" con i programmi di GDI +.

Codice di esempio

Microsoft fornisce esempi di programmazione a scopo puramente illustrativo, senza alcuna garanzia di qualsiasi tipo, sia espressa che implicita, ivi incluse, senza limitazioni, le garanzie implicite di commerciabilità o idoneità per uno scopo particolare. In questo articolo si presume che l'utente conosca il linguaggio di programmazione in questione e gli strumenti utilizzati per creare ed eseguire il debug delle procedure. Gli addetti al Supporto Microsoft possono spiegare la funzionalità di una particolare procedura, ma non possono modificare questi esempi per fornire ulteriori funzionalità o realizzare procedure per soddisfare esigenze specifiche.
Se si dispone di esperienza di programmazione limitata, è possibile che desideri contattare un Microsoft Certified Partner o servizi di consulenza Microsoft. Per ulteriori informazioni, visitare questi siti Web di Microsoft:

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

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

Per ulteriori informazioni sulle opzioni di supporto disponibili e su come contattare Microsoft, visitare il seguente sito: 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;
}
				

Proprietà

Identificativo articolo: 319261 - Ultima modifica: lunedì 21 maggio 2007 - Revisione: 4.7
Le informazioni in questo articolo si applicano a:
  • Microsoft .NET Framework 1.0 alle seguenti piattaforme
    • the operating system: Microsoft Windows XP
  • Microsoft GDI+ 1.0 alle seguenti piattaforme
    • the operating system: Microsoft Windows XP
  • Microsoft Office XP alle seguenti piattaforme
    • the operating system: Microsoft Windows XP
  • Microsoft Visio 2002 Professional Edition alle seguenti piattaforme
    • the operating system: Microsoft Windows XP
  • Microsoft Visio 2002 Standard Edition alle seguenti piattaforme
    • the operating system: Microsoft Windows XP
Chiavi: 
kbmt kbbug kbfix kbshell kbwinxpsp1fix KB319261 KbMtit
Traduzione automatica articoli
Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 319261
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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