通过 GDI + 呈现的图形无法在放大的屏幕放大器

文章翻译 文章翻译
文章编号: 319261 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

症状

通过 GDI + 呈现的图形不能被放大的屏幕放大器。此问题会影响使用 GDI +,包括 Microsoft Office XP、 Microsoft Visio 2002、 Microsoft.net 框架和 Windows 外壳程序的任何程序。

原因

GDI + 使用名为 DCI 呈现直接到前台缓冲区的机制。GDI + 不会生成 GDI DDI 呼叫时它会呈现以这种方式。但是,假定所有呈现都发生通过 GDI,通过将工作屏幕放大器。屏幕放大器挂钩 GDI DDI 调用、 捕获所有呈现到一个屏幕外的位图和绘制在屏幕上放大该位图的一部分。

如果屏幕放大镜运行与使用 GDI + 的程序,屏幕上的某些部分绘制放大,而某些部分绘制 unmagnified。

解决方案

若要解决此问题,获得最新的 service pack,对于 Windows XP。有关更多的信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
322389如何获取最新的 Windows XP 服务包
若要解决此问题,获取以下 Microsoft 知识库文章中提到的更新:
318966查看、 编辑,或打印在 Windows XP 中的某些图像的问题

程序开发人员的

您是否程序开发人员必须更新您的程序,以便它可以告诉 GDI + 使用 GDI 而不是 DCI 的呈现。每个 GDI + 实例都包含一个隐藏的顶级窗口,其标题是"GDI + 窗口",其类名称是 GDI + 挂钩窗口类。GDI + 在隐藏的窗口时您安装更新所述文章 Q318966,侦听的名为"GDI + 辅助功能"的专用窗口消息。如果 GDI + 在隐藏的窗口收到此消息,它停止使用 DCI 进行呈现,并启动而使用 GDI。这使得 GDI + 屏幕放大器能正常工作。

当屏幕放大镜加载时,它必须注册名为"GDI + 辅助功能"的专用窗口消息。GDI + 注册私有消息的相同的名称,以便将放大镜可以用 GDI + 通信通过使用此消息。在放大镜然后必须扫描所有现有的顶级窗口。如果将放大镜发现的被命名为"GDI + 窗口",并且其类名称是 GDI + 挂钩窗口类 的任何窗口,在放大镜必须将"GDI + 辅助功能"消息发送到这些窗口。这样,任何现有的 GDI + 程序正确地放大。

屏幕放大镜还必须监视的任何新 GDI + 加载的程序后开始。在放大镜可以通过执行此操作设置使用 SetWinEventHook 每次创建一个新窗口时调用的回调函数。如果与正确的标题和类名创建一个新窗口,在放大镜必须将"GDI + 辅助功能"消息发送到它。

请注意,在某个特定实例的 GDI + 后开始使用 GDI 而不 DCI 呈现它不能切换到使用 DCI,除非该程序已退出并重新启动。GDI + 呈现速度更慢使用 DCI 比使用 GDI。如果用户不再需要用 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 简体中文专业版?当用于
    • the operating system: Microsoft Windows XP
  • Microsoft Visio 2002 简体中文标准版?当用于
    • the operating system: Microsoft Windows XP
关键字:?
kbmt kbbug kbfix kbshell kbwinxpsp1fix KB319261 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 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