Gráficos que están representados por GDI + puede no ampliados por ampliadores de pantalla

Seleccione idioma Seleccione idioma
Id. de artículo: 319261 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Síntomas

Gráficos que están representados por GDI + no pueden ser ampliados por ampliadores de pantalla. Este problema afecta a cualquier programa que utilice GDI +, incluidos Microsoft Office XP, Microsoft Visio 2002, Microsoft .NET Framework y el shell de Windows.

Causa

GDI + utiliza un mecanismo que se denomina DCI representar directamente en el búfer frontal. GDI + no genera llamadas DDI de GDI cuando procesa de esta manera. Sin embargo, ampliadores de pantalla funcionan por suponiendo que todo representación se produce a través de GDI. Ampliadores de pantalla enlazar las llamadas DDI de GDI, capturar todo el procesamiento en un mapa de bits fuera de pantalla y dibujar una parte de ese mapa de bits ampliado en la pantalla.

Si se ejecuta un Ampliador de pantalla con un programa que utilice GDI +, algunas partes de la pantalla se dibujan ampliada y algunas partes se dibujan sin ampliar.

Solución

Para resolver este problema, obtenga el Service Pack más reciente para Windows XP. Para obtener información adicional, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
322389Cómo obtener el Windows XP Service Pack más reciente
Para resolver este problema, obtenga la actualización mencionada en el siguiente artículo de Microsoft Knowledge Base:
318966Problemas para ver, modificar o imprimir algunas imágenes en Windows XP

Para desarrolladores de programas

Si eres un desarrollador de programa, debe actualizar el programa para que indica a GDI + para que utilice GDI en lugar de DCI para procesamiento. Cada instancia GDI + contiene una ventana de nivel superior oculta cuyo título es "ventana GDI +" y cuyo nombre de clase es Clase de ventana de enlace GDI + . Al instalar la actualización que se describe en artículo Q318966, la ventana oculta GDI + escucha un mensaje de ventana privada que se denomina "accesibilidad GDI +". Si la ventana oculta GDI + recibe este mensaje, deja de utilizar DCI para procesamiento y se inicia mediante GDI en su lugar. Esto hace funcionar correctamente con ampliadores de pantalla GDI +.

Cuando se carga un Ampliador de pantalla, debe registrar un mensaje de ventana privada que se denomina "accesibilidad GDI +". GDI + registra un mensaje privado el mismo nombre, para que el Ampliador puede comunicarse con GDI + mediante este mensaje. El Ampliador, a continuación, debe buscar todas las ventanas de nivel superior existentes. Si el Ampliador encuentra todas las ventanas que se denominan "ventana GDI +" y cuyo nombre de clase es la Clase de ventana de enlace GDI + , el Ampliador debe enviar el mensaje "acceso GDI +" a esas ventanas. Esto permite que cualquier programa GDI + existente a ampliar correctamente.

El Ampliador de pantalla también debe inspeccionar los nuevos programas GDI + que se cargan después de iniciarse. El Ampliador puede hacerlo estableciendo una función de devolución de llamada utilizando SetWinEventHook que se llama cada vez que se crea una nueva ventana. Si se crea una nueva ventana con el título correcto y el nombre de clase, el Ampliador debe enviar el mensaje "acceso GDI +" a él.

Observe que después de que una instancia determinada de GDI + comience utilizando GDI en lugar de DCI para representar, no puede cambiarla a utilizando DCI a menos que se salga y reinicie el programa. GDI + se procesa más despacio utilizando GDI que utilizando DCI. Si el usuario ya no requiere un Ampliador con GDI + y desea aumentar el rendimiento de representación, el usuario puede reiniciar el programa GDI +.

Estado

Microsoft ha confirmado que se trata de un problema de los productos de Microsoft enumerados en la sección "La información de este artículo se refiere a:" de este artículo. Este problema se corrigió por primera vez en el Service Pack 1 de Windows XP.

Más información

El programa de ejemplo siguiente muestra cómo utilizar la nueva funcionalidad GDI + en el programa. Incluir los archivos Gdipacs.c y Gdipacs.h en el proyecto. Se debe llamar a GDIPlusDCIOff_Init cuando se inicia el programa. Esto hace que todos los programas GDI + existentes detener el procesamiento utilizando DCI y hace que los programas nuevos en GDI + que se cargan para que no utilice DCI para representar. Se debe llamar a GDIPlusDCIOff_Uninit cuando se cierra el programa. GDI + programas existentes no se pueden volver a usar DCI pero nuevos programas de GDI + utilizará DCI tal como suele suceder.

El archivo Testmain.c demuestra esta funcionalidad. Compile y ejecute el archivo para probar el mensaje "acceso GDI +" con los programas de GDI +.

Código de ejemplo

Microsoft proporciona ejemplos de programación con fines ilustrativos únicamente, sin ninguna garantía tanto expresa como implícita, incluyendo, pero sin limitarse a, las garantías implícitas de comerciabilidad e idoneidad para un propósito determinado. En este artículo se supone que está familiarizado con el lenguaje de programación que se muestra y las herramientas utilizadas para crear y depurar procedimientos. Los profesionales de soporte técnico de Microsoft pueden explicarle la funcionalidad de un determinado procedimiento, pero no modificarán estos ejemplos para ofrecer mayor funcionalidad ni crearán procedimientos a necesidades específicas.
Si tiene poca experiencia en programación, desea póngase en contacto con un Microsoft Certified Partner o servicios de consultoría de Microsoft. Para obtener más información, visite estos sitios Web de Microsoft:

Microsoft certificado Partners - https://partner.microsoft.com/global/30000104

Servicios de asesoramiento de Microsoft - http://support.microsoft.com/gp/advisoryservice

Para obtener más información acerca de las opciones de soporte técnico que están disponibles y cómo ponerse en contacto con Microsoft, visite el siguiente sitio Web de Microsoft: 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;
}
				

Propiedades

Id. de artículo: 319261 - Última revisión: lunes, 21 de mayo de 2007 - Versión: 4.7
La información de este artículo se refiere a:
  • Microsoft .NET Framework 1.0 sobre las siguientes plataformas
    • the operating system: Microsoft Windows XP
  • Microsoft GDI+ 1.0 sobre las siguientes plataformas
    • the operating system: Microsoft Windows XP
  • Microsoft Office XP sobre las siguientes plataformas
    • the operating system: Microsoft Windows XP
  • Microsoft Visio 2002 Professional Edition sobre las siguientes plataformas
    • the operating system: Microsoft Windows XP
  • Microsoft Visio 2002 Standard Edition sobre las siguientes plataformas
    • the operating system: Microsoft Windows XP
Palabras clave: 
kbmt kbbug kbfix kbshell kbwinxpsp1fix KB319261 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 319261

Enviar comentarios

 

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