Não é possível ser ampliados de gráficos que são compostos por GDI +, ampliação do ecrã

Traduções de Artigos Traduções de Artigos
Artigo: 319261 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Gráficos que são compostos por GDI + não podem ser ampliados de ampliação do ecrã. Este problema afecta qualquer programa que utilize GDI +, incluindo o Microsoft Office XP, Microsoft Visio 2002, Microsoft .NET Framework e a shell do Windows.

Causa

GDI + utiliza um mecanismo que chama DCI para compor directamente na memória intermédia frontal. GDI + não gera GDI DDI chamadas quando compõe desta forma. No entanto, ampliação do ecrã trabalhar, partindo do princípio que composição tudo ocorre através de GDI. Ampliação do ecrã ligar as chamadas de GDI DDI, captura todas composição para um mapa de bits não visível e desenhe uma parte do mapa de bits que ampliado no ecrã.

Se um ampliador de ecrã é executada com um programa que utiliza GDI +, algumas partes do ecrã são desenhadas ampliada e algumas partes são desenhadas unmagnified.

Resolução

Para resolver este problema, obtenha o service pack mais recente do Windows XP. Para obter informações adicionais, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
322389Como obter o Windows XP Service Pack mais recente
Para resolver este problema, obtenha a actualização mencionada no seguinte artigo da base de dados de conhecimento da Microsoft:
318966Problemas em visualizar, editar ou imprimir algumas imagens no Windows XP

Para programadores de programas

Se for um programador de programa, tem de actualizar o programa isso indica GDI + para utilizar GDI em vez de DCI para composição. Cada instância de GDI + contém uma janela de nível superior oculta cujo título é "GDI + janela" e cujo nome de classe é o GDI + gancho classe de janela . Quando instala a actualização descrita no artigo Q318966, a janela oculta GDI + recebe uma mensagem privada janela com o nome "GDI + acessibilidade." Se a janela oculta GDI + recebe esta mensagem, deixa de utilizar DCI para composição e começar a utilizar em vez disso, a GDI. Isto torna o GDI + funcione correctamente com ampliação do ecrã.

Quando carrega um ampliador de ecrã, tem de registar uma mensagem privada janela com o nome "GDI + acessibilidade." GDI + regista uma mensagem privada com o mesmo nome para que o magnifier pode comunicar com GDI + utilizando esta mensagem. O magnifier deve analisar todas as janelas de nível superior existentes. Se o magnifier localiza as janelas que são denominados "GDI + janela" e cujo nome de classe é o GDI + gancho classe de janela , o magnifier deve enviar a mensagem "GDI + acessibilidade" para as janelas. Isto faz com qualquer GDI + programas existentes ampliar correctamente.

O ampliador de ecrã também tem procure qualquer novos GDI + programas que são carregados depois de ser iniciado. O magnifier pode fazê-lo como uma função de chamada de retorno utilizando SetWinEventHook denomina-se sempre que for criada uma nova janela. Se for criada uma nova janela com o título correcto e o nome da classe, o magnifier deve enviar a mensagem "GDI + acessibilidade" à mesma.

Note que, após uma determinada instância da GDI +, começa a utilizar GDI em vez de DCI para compor, não é possível mudar para utilizar DCI a menos que o programa é sair e reiniciar. GDI + compõe mais lentamente utilizando GDI do que utilizando DCI. Se o utilizador já não necessita de uma lupa com GDI + e pretende aumentar o desempenho do processamento, o utilizador pode reiniciar o programa GDI +.

Ponto Da Situação

A Microsoft confirmou que este é um problema nos produtos da Microsoft listados no início deste artigo. Este problema foi corrigido pela primeira vez no Windows XP Service Pack 1.

Mais Informação

O programa de exemplo seguinte demonstra como utilizar a nova funcionalidade do GDI + no programa. Inclua os ficheiros Gdipacs.c e Gdipacs.h no projecto. Tem de chamar GDIPlusDCIOff_Init quando o programa é iniciado. Isto faz com que todos os GDI + programas existentes parar a composição utilizando DCI e faz com que qualquer novos GDI + programas que são carregados para não utilizar DCI para compor. Tem de chamar GDIPlusDCIOff_Uninit quando o programa é encerrado. Programas existentes GDI + não é possível reverter para utilizar DCI, mas novos GDI + programas utilizará DCI como fazem normalmente.

O ficheiro Testmain.c demonstra esta funcionalidade. Compile e execute o ficheiro para testar a mensagem "GDI + acessibilidade" com os programas GDI +.

Código de exemplo

Microsoft fornece exemplos de programação ilustração só, sem garantia expressa ou implícita, incluindo, sem limitação, garantias implícitas de comercialização e/ou adequação a um fim específico. Este artigo pressupõe que está familiarizado com a linguagem de programação apresentada e as ferramentas utilizadas para criar e depurar procedimentos. Profissionais de suporte da Microsoft podem ajudar a explicar a funcionalidade de um determinado procedimento, mas não modificarão estes exemplos para proporcionarem funcionalidades adicionais nem criarão procedimentos adaptados às necessidades específicas.
Se dispõe de limitada experiência de programação, poderá contactar um Microsoft Certified Partner ou a serviços de aviso. Para obter mais informações, visite estes Web sites da Microsoft:

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

Serviços Microsoft aviso - http://support.microsoft.com/gp/advisoryservice

Para obter mais informações sobre as opções de suporte estão disponíveis e sobre como contactar a Microsoft, visite o seguinte Web site da 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;
}
				

Propriedades

Artigo: 319261 - Última revisão: 21 de maio de 2007 - Revisão: 4.7
A informação contida neste artigo aplica-se a:
  • Microsoft .NET Framework 1.0 nas seguintes plataformas
    • the operating system: Microsoft Windows XP
  • Microsoft GDI+ 1.0 nas seguintes plataformas
    • the operating system: Microsoft Windows XP
  • Microsoft Office XP nas seguintes plataformas
    • the operating system: Microsoft Windows XP
  • Microsoft Visio 2002 Professional Edition nas seguintes plataformas
    • the operating system: Microsoft Windows XP
  • Microsoft Visio 2002 Standard Edition nas seguintes plataformas
    • the operating system: Microsoft Windows XP
Palavras-chave: 
kbmt kbbug kbfix kbshell kbwinxpsp1fix KB319261 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 319261

Submeter comentários

 

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