GDI+ tarafından işlenen grafikler ekran büyüteçleriyle büyütülemiyor

Makale çevirileri Makale çevirileri
Makale numarası: 319261 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Bu Sayfada

Belirtiler

GDI+ tarafından işlenen grafikler ekran büyüteçleriyle büyütülemiyor. Bu sorun, GDI Microsoft Office XP, Microsoft Visio 2002, Microsoft .NET Framework ve Windows Kabuğu + kullanan herhangi bir programı etkiler.

Neden

GDI + ön arabelleğine doğrudan işlemek için DCI adlı bir düzenek kullanır. Bu, bu şekilde işler, GDI + GDI DDI çağrıları oluşturmaz. Ancak, GDI tüm işlemeyi oluşuyor varsayarak ekran büyüteçleri tarafından çalışır. Ekran büyüteçleri GDI DDI çağrıları için kanca tüm ekran dışında bir bit eşlem işleme yakalamak ve bu bitmap, ekranın büyütülmüş bir bölümünü çizin.

Bir Ekran Büyütücü GDI + kullanan bir program çalışıyorsa, bazı bölümleri ekranın büyütülmüş olarak çizilir ve bazı bölümleri unmagnified çizilir.

Çözüm

Bu sorunu gidermek için, en son Windows XP hizmet paketini edinin. Ek bilgi için, Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
322389en son Windows XP hizmet paketi nasıl elde edilir
Bu sorunu gidermek için <a0></a0>, aşağıdaki Microsoft Bilgi Bankası makalesinde belirtilen güncelleştirmeyi edinin:
318966Windows XP'de bazı resimleri görüntüleme, düzenleme veya yazdırma sorunları

Program geliştiriciler için

Program bir geliştirici iseniz, böylece bunun yerine DCI GDI oluşturma için kullanılacak GDI + söyler programınızı güncelleştirmelisiniz. GDI + örneğinde, "Windows GDI +" başlıktır ve sınıf adı, GDI + Hook pencere sınıfı olan bir gizli üst düzey pencere içerir. Q318966 makalede anlatılan güncelleştirmeyi yüklediğinizde, GDI + gizli pencere "GDı + erişilebilirlik." adlı özel pencere iletiye dinler. GDI + gizli pencere bu iletiyi aldığında, işleme için DCI kullanarak durdurur ve bunun yerine, GDI kullanarak başlatır. Bu GDI + ile ekran büyüteçleri düzgün sağlar.

Bir Ekran Büyütücü yüklediğinde "GDı + erişilebilirlik." adlı özel pencere iletiye kaydetmeniz gerekir GDI + Büyüteç GDI + ile bu ileti kullanarak iletişim kurabilirsiniz; böylece, aynı adlı özel bir ileti kaydeder. Büyüteç, varolan tüm üst düzey pencereleri sonra tarama gerekir. Büyüteç Büyüteç, "Windows GDI +" olarak adlandırılır ve sınıf adı, GDI + Hook pencere sınıfı olan windows bulursa, bu windows için "Erişilebilirlik GDI +" iletisi göndermesi gerekir. Bu, varolan doğru büyütmek GDI + programları sağlar.

Ekran Büyütücü başladıktan sonra yüklenen tüm yeni GDI + programlar için de izlemek gerekir. Büyüteç her açtığınızda yeni pencere oluşturulduğunda, olarak adlandırılan SetWinEventHook kullanarak bir geri çağırma işlevi ayarlayarak bunu yapabilirsiniz. Doğru başlığı ve sınıf adı ile yeni bir pencere oluşturulduysa, Büyüteç için "Erişilebilirlik GDI +" ileti göndermelidir.

GDI +'ın belirli bir örneğini oluşturmak için GDI yerine DCI kullanarak başladıktan sonra programı kapatın ve yeniden geri DCI kullanmaya geçilemiyor olduğunu unutmayın. GDI + DCı'nı kullanarak yapar GDI kullanarak daha yavaş oluşturur. Kullanıcı, kullanıcı artık bir Büyüteç ile GDI + gerektirir ve işleme performansını artırmak ister, GDI + program yeniden başlatabilirsiniz.

Durum

Microsoft, bu makalenin başında listelenen Microsoft ürünlerinde bir sorun olduğunu onaylamıştır. Bu sorun ilk olarak Windows XP Service Pack 1'de giderilmiştir.

Daha fazla bilgi

Aşağıdaki örnek program, programın yeni GDI + işlevselliğinde nas?l kullan?laca??n? gösterir. Gdipacs.c ve Gdipacs.h dosyaları projenizde içerir. Programınız başlatıldığında GDIPlusDCIOff_Init çağırmalısınız. DCI kullanarak oluşturmayı durdurmak tüm varolan GDI + programları bu neden olur ve DCI işlemek için kullanmamak için yüklenen tüm yeni GDI + programları olur. Programınızı sonlandırıldığında GDIPlusDCIOff_Uninit çağırmalısınız. Varolan GDI + programları DCI kullanmaya geri dönemezsiniz, ancak bunlar normalde yaptığınız gibi GDI + yeni programlar DCI kullanır.

Testmain.c dosyası, bu işlevselliği gösterir. Derleme ve GDI + programlarınızı "Erişilebilirlik GDI +" iletisiyle sınamak için dosyasını çalıştırın.

Örnek kod

Microsoft, programlama örneklerini yalnızca gösterim amacıyla sağlar; satılabilirlik ve/veya belirli bir amaca uygunluk da dahil, ancak bununla sınırlı olmamak kaydıyla, örtülü veya açık garanti vermez. Bu makale, gösterilen programlama dilini ve yordamları oluşturmak ve hata ayıklamak amacıyla kullanılan araçları kullanmayı bildiğinizi varsayar. Microsoft destek uzmanları, belirli bir yordamın işlevselliğinin açıklanmasına yardımcı olabilir, ancak gereksinimlerinizi karşılamaya yönelik olarak ek işlevsellik sağlamak veya yordamlar geliştirmek amacıyla bu örnekleri değiştirmezler.
Programlama deneyiminiz kısıtlıysa, bir Microsoft Sertifikalı İş Ortağı'na veya Microsoft Danışmanlık Hizmetleri'ne başvurabilirsiniz. Daha fazla bilgi için şu Microsoft Web sitelerini ziyaret edin:

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

Microsoft danışma belgesi Hizmetleri - http://support.microsoft.com/gp/advisoryservice

Kullanılabilir destek seçenekleri ve Microsoft'a başvurma konusunda daha fazla bilgi için aşağıdaki Microsoft Web sitesini ziyaret edin: 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;
}
				

Özellikler

Makale numarası: 319261 - Last Review: 21 Mayıs 2007 Pazartesi - Gözden geçirme: 4.7
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft .NET Framework 1.0, Ne zaman ne ile kullanilir:
    • the operating system: Microsoft Windows XP
  • Microsoft GDI+ 1.0, Ne zaman ne ile kullanilir:
    • the operating system: Microsoft Windows XP
  • Microsoft Office XP, Ne zaman ne ile kullanilir:
    • the operating system: Microsoft Windows XP
  • Microsoft Visio 2002 Professional Edition, Ne zaman ne ile kullanilir:
    • the operating system: Microsoft Windows XP
  • Microsoft Visio 2002 Standard Edition, Ne zaman ne ile kullanilir:
    • the operating system: Microsoft Windows XP
Anahtar Kelimeler: 
kbmt kbbug kbfix kbshell kbwinxpsp1fix KB319261 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:319261

Geri Bildirim Ver

 

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