呈現的 GDI + 圖形無法放大螢幕 Magnifiers 由

文章翻譯 文章翻譯
文章編號: 319261 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

徵狀

呈現的 GDI + 圖形無法放大螢幕 magnifiers 由。這個問題會影響使用 GDI +,包括 Microsoft Office XP,Microsoft Visio 2002、 Microsoft.NET Framework 和 Windows 殼層的任何程式。

發生的原因

GDI + 使用名為 DCI 呈現直接到前端緩衝區的機制。GDI + 不會產生 GDI DDI 呼叫時它會以這種方式呈現。不過,螢幕 magnifiers 工時假設所有轉譯都發生透過 GDI。螢幕 magnifiers 攔截 GDI DDI 呼叫、 擷取所有轉譯成一個幕後點陣圖並繪製在螢幕上放大該點陣圖的一部份。

如果使用 GDI + 的程式以執行螢幕放大鏡,螢幕的某些部分繪製放大,某些部分繪製 unmagnified。

解決方案

如果要解決這個問題,取得最新的 Service Pack 的 Windows XP。如需詳細資訊按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
322389如何取得最新的 Windows XP Service Pack
如果要解決這個問題,取得下列 「 Microsoft 知識庫 」 文件中提到的更新程式:
318966檢視,編輯,或列印在 Windows XP 中的某些影像的問題

程式開發人員

如果您是程式開發人員,您必須更新您的程式,讓它會告訴 GDI + 使用 GDI,而不是用於呈現的 DCI。每個 GDI + 執行個體包含隱藏的最上層視窗職稱是"GDI + 視窗 」,而其類別名稱是 GDI + 虎視窗類別。當您安裝更新所述 Q318966 」 文件中時,GDI + 隱藏的視窗會接聽的名為"GDI + 協助工具"的私用的視窗訊息。如果 GDI + 隱藏的視窗會收到這個訊息,停止使用 DCI 用於呈現並開始改為使用 GDI。這使得 GDI + 螢幕 magnifiers 中正常運作。

螢幕放大鏡載入時, 它必須註冊名稱為"GDI + 協助工具"的私用的視窗訊息。GDI + 讓放大鏡可以使用 GDI + 來使用此訊息通訊,請註冊相同名稱的私用訊息。放大鏡必須再掃描所有現有的最上層視窗。如果將 [放大鏡] 找到名稱為"GDI + 視窗 」 的任何視窗並其類別名稱是 GDI + 虎視窗類別,放大鏡必須將 「 GDI + 協助工具 」 訊息傳送給這些視窗。這使得任何現有的 GDI + 程式正確地放大。

螢幕放大鏡也必須監看的任何新 GDI + 的程式會載入其開始之後。在 [放大鏡] 可以這樣做,即可使用 SetWinEventHook,每次建立新的視窗呼叫設定回呼函式。如果具有正確的標題和類別名稱建立新的視窗,放大鏡必須將 「 GDI + 協助工具 」 訊息傳送至它。

注意,在 GDI + 的特定執行個體之後開始使用 GDI,而不要呈現的 DCI 它不能切換回使用 DCI,除非程式結束並重新啟動。GDI + 藉由使用 GDI 比它會藉由使用 DCI 得慢些呈現。如果使用者不再需要使用 GDI + 的 [放大鏡],並想要增加呈現效能,使用者可以重新啟動 GDI + 程式。

狀況說明

Microsoft 已確認這是在本文開頭所列之 Microsoft 產品中的問題。這個問題最早是在 Windows XP Service Pack 1 中獲得修正。

其他相關資訊

下列範例程式會示範如何在程式中使用新的 GDI + 功能。在您的專案中包含 Gdipacs.c 和 Gdipacs.h] 檔案。當您的程式啟動時,您必須呼叫 GDIPlusDCIOff_Init。這樣會造成所有現有的 GDI + 程式來停止使用 DCI,呈現,而且它會造成任何新 GDI + 的程式會載入不想使用 DCI 來呈現。當您的程式結束時,您必須呼叫 GDIPlusDCIOff_Uninit。 現有 GDI + 的程式無法還原成使用 DCI,但是新 GDI + 程式會使用 DCI,像通常一樣。

Testmain.c 檔案示範這項功能。編譯並執行測試與 GDI + 程式"GDI + 協助工具 」 訊息的檔案。

範例程式碼

Microsoft 僅,為了說明提供程式設計範例,不提供任何明示或默示的保證,包括但不是限於適售性以及適合某特定用途之默示擔保責任。本文假設您已熟悉我們所示範的程式設計語言,以及用來建立和偵錯程序的工具。Microsoft 技術支援工程師可以協助解釋特定程序的功能,但它們不會修改這些範例以提供附加功能或建構程序,以符合您的特定需求。
如果您有限制程式設計經驗,您可以連絡 Microsoft 認證合作夥伴或 Microsoft 諮詢服務。如需詳細資訊請造訪下列 Microsoft] 網站:

Microsoft 認證合作夥伴-https://partner.microsoft.com/global/30000104

Microsoft 摘要報告服務-http://support.microsoft.com/gp/advisoryservice

如需有關可用的支援選項,以及有關如何連絡 Microsoft 的詳細資訊,請造訪下列 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;
}
				

屬性

文章編號: 319261 - 上次校閱: 2007年5月21日 - 版次: 4.7
這篇文章中的資訊適用於:
  • Microsoft .NET Framework 1.0?應用於:
    • the operating system: Microsoft Windows XP
  • Microsoft GDI+ 1.0?應用於:
    • the operating system: Microsoft Windows XP
  • Microsoft Office XP?應用於:
    • the operating system: Microsoft Windows XP
  • Microsoft Visio 2002 Professional Edition?應用於:
    • the operating system: Microsoft Windows XP
  • Microsoft Visio 2002 Standard Edition?應用於:
    • the operating system: Microsoft Windows XP
關鍵字:?
kbmt kbbug kbfix kbshell kbwinxpsp1fix KB319261 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:319261
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

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