Grafiku vykreslovanou rozhraním GDI+ nelze zvětšit lupou obrazovky (Tento článek může obsahovat odkazy na anglický obsah (dosud nepřeložený).)

Překlady článku Překlady článku
ID článku: 319261 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Příznaky

Grafiku vykreslovanou rozhraním GDI+ nelze zvětšit lupou obrazovky (Tento článek může obsahovat odkazy na anglický obsah (dosud nepřeložený).). Tento problém týká programu, který používá GDI +, včetně Microsoft Office XP, Microsoft Visio 2002, Microsoft .NET Framework a prostředí Windows.

Příčina

GDI + používá mechanismus s názvem DCI vykreslení přímo do přední vyrovnávací paměti. GDI + při vykreslí tímto způsobem negeneruje GDI DDI volání. Však obrazovky magnifiers práci za předpokladu, že vykreslování všech dojde prostřednictvím GDI. Magnifiers obrazovky zavěšení volání GDI DDI, všechny vykreslování do mimo obrazovku rastrový obrázek zachytit a nakreslete část dané rastr zvětšit na obrazovce.

Program Lupa obrazovky se spustí s program, který používá GDI +, některé části obrazovce kresleny zvětšená a některé části kresleny unmagnified.

Řešení

Problém vyřešíte instalací nejnovější aktualizace Service Pack pro systém Windows XP. Další informace získáte v následujícím článku znalostní báze Microsoft Knowledge Base:
322389získání nejnovější aktualizace Service Pack pro systém Windows XP
Tento problém vyřešíte získat aktualizaci uvedenou v následujícím článku znalostní báze Microsoft Knowledge Base:
318966Potíže při zobrazování, úpravách či tisku některých obrázků v systému Windows XP

Pro vývojáře programů

Jsou Vývojář programu musíte aktualizovat váš program tak, aby informuje GDI + pro vykreslování použít namísto DCI GDI. Každá instance GDI + obsahuje skryté nejvyšší úrovně okno, jehož název je "Windows GDI +" a jejichž název třídy je Třída okna háčkem GDI +. Při instalaci aktualizace popsané v článku Q318966 skryté okno GDI + naslouchá soukromé okno zprávy s názvem "GDI + usnadnění." Pokud tuto zprávu přijme skryté okno GDI +, zastaví pomocí DCI vykreslování a spustí místo pomocí GDI. To umožňuje pracovat správně s obrazovky magnifiers GDI +.

Když načte program Lupa obrazovky musí registrovat soukromé okno zprávy s názvem "GDI + usnadnění." GDI + registruje soukromé zprávy stejný název, tak program Lupa může komunikovat s GDI + pomocí této zprávy. Programu Lupa musí potom prohledejte všechny existující windows nejvyšší úrovně. Pokud programu Lupa najde windows nazvanou "Windows GDI +" a jejichž název třídy je GDI + háčkem třída okna, programu Lupa musí odeslat zprávu "usnadnění GDI +" těchto oken. Tím všechny existující GDI + programy správně zvětšit.

Program Lupa obrazovky musí také sledovat pro všechny nové GDI + programy, které jsou načteny po spuštění. Programu Lupa můžete to provést nastavením funkci zpětného volání pomocí SetWinEventHook je volána při každém vytvoření nového okna. Nové okno vytvořena s správný nadpis a název třídy, programu Lupa musí odeslat zprávu "usnadnění GDI +" ji.

Všimněte si, že po konkrétní instanci GDI + začíná pomocí GDI namísto DCI vykreslit jej nelze přepnout zpět pomocí DCI, pokud program ukončit a restartovat. GDI + vykreslí pomaleji než pomocí DCI pomocí GDI. Pokud uživatel již vyžaduje program Lupa s GDI + a chce zvýšit výkon vykreslování, uživatel může restartovat program GDI +.

Prohlášení

Společnost Microsoft potvrzuje, že se jedná o problém v produktech této společnosti, které jsou uvedeny na začátku tohoto článku. Tento problém byl poprvé opraven aktualizací Windows XP Service Pack 1.

Další informace

Následující ukázkový program demonstruje použití nové funkce GDI + v programu. Zahrnout soubory Gdipacs.c a Gdipacs.h v projektu. Při spuštění programu je třeba zavolat GDIPlusDCIOff_Init. To způsobí, že všechny existující GDI + programy zastavit vykreslování pomocí DCI a způsobí žádné nové GDI + programy, které jsou načteny nepoužívat DCI vykreslit. GDIPlusDCIOff_Uninit musí volat, když je váš program ukončí. Existující programy GDI + nelze vrátit zpět pomocí DCI, ale nové GDI + programy použít DCI, obvykle stejně jako.

Tuto funkci demonstruje souboru Testmain.c. Zkompilujte a spusťte soubor zkušební zprávy "GDI + usnadnění" s programy GDI +.

Ukázkový kód

Ukázky programů jsou společností Microsoft poskytovány pouze pro ilustraci bez žádné záruky výslovně uvedené ani předpokládané, včetně předpokládaných záruk vztahujících se k obchodovatelnosti nebo vhodnosti pro určitý účel. Tento článek předpokládá, že uživatel je obeznámen s programovacím jazykem, který je předmětem ukázky, a s nástroji použitými pro vytvoření a ladění skriptu. Pracovníci technické podpory společnosti Microsoft mohou vysvětlit funkce určitého postupu, nemohou však následující příklady rozšířit o další funkce nebo konstrukce podle konkrétních požadavků uživatele.
Pokud máte zkušenosti s programováním omezený, můžete kontaktovat partnera s certifikátem Microsoft nebo služby Advisory. Na další informace těchto webech společnosti Microsoft:

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

Služba Microsoft zpravodaje - http://support.microsoft.com/gp/advisoryservice

Další informace o možnostech podpory, které jsou k dispozici a o možnostech kontaktování společnosti Microsoft na následujícím webu společnosti 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;
}
				

Vlastnosti

ID článku: 319261 - Poslední aktualizace: 21. května 2007 - Revize: 4.7
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft .NET Framework 1.0 na těchto platformách
    • the operating system: Microsoft Windows XP
  • Microsoft GDI+ 1.0 na těchto platformách
    • the operating system: Microsoft Windows XP
  • Microsoft Office XP na těchto platformách
    • the operating system: Microsoft Windows XP
  • Microsoft Visio 2002 Professional Edition na těchto platformách
    • the operating system: Microsoft Windows XP
  • Microsoft Visio 2002 Standard Edition na těchto platformách
    • the operating system: Microsoft Windows XP
Klíčová slova: 
kbmt kbbug kbfix kbshell kbwinxpsp1fix KB319261 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:319261

Dejte nám zpětnou vazbu

 

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