Windows XP上的GDI +问题

时间:2012-03-03 20:34:10

标签: c++ winapi gdi+

我正在使用GDI +来渲染登录窗口。这一切都适用于Windows 7,但是 在Windows XP(包含所有更新的SP3)上,绝对没有输出。

WM_PAINT中的代码

PAINTSTRUCT ps;
HDC         hdc = BeginPaint( hwnd, &ps );
Graphics    *graphics= new Graphics( hdc );

if ( graphics->Clear( BACKGROUND_COLOR ) != Ok )
{
    LOGGER << "LoginWindow::Error clearing surface" << endl;
    goto clean;
}

if ( graphics->DrawImage( dialogHeader, 0, 0, dialogHeaderSize.cx, dialogHeaderSize.cy ) != Ok )
{
    LOGGER << "LoginWindow::Error drawing image" << endl;
    goto clean;
}

if ( graphics->DrawRectangle( dialogBorderPen, 0, 0, LOGIN_WINDOW_WIDTH - 1, LOGIN_WINDOW_HEIGHT - 1 ) != Ok )
{
    LOGGER << "LoginWindow::Error drawing rectangle" << endl;
    goto clean;
}

clean:
delete graphics;
EndPaint( hwnd, &ps );

dialogHeader是一个带有以下代码的.png图像:

dialogHeader = Bitmap::FromFile( imagePath );

GDI +初始化如下:

GdiplusStartupInput gdiplusStartupInput;
Status              gdiplusStatus;
ULONG_PTR           gdiplusToken;

gdiplusStatus = GdiplusStartup( &gdiplusToken, &gdiplusStartupInput, NULL );

if ( gdiplusStatus != Ok )
{
    LOGGER << "Main::Failed to initialize GDI+. ErrorCode=" << gdiplusStatus << endl;
    return 1;
}

一些已知的事实:

  • 绘画代码始终成功执行(使用调试器验证 - Visual Studio 2010)
  • 图像加载时没有错误
  • 无论Windows主题/ aero是关闭还是开启
  • ,都会发生这种情况
  • 当我将Windows XP上的窗口拖出屏幕然后返回时,图像显示如下:

http://imageshack.us/photo/my-images/851/winxp2.png/

Windows 7上的输出

http://imageshack.us/photo/my-images/824/win7p.png/

Windows XP上的输出

http://imageshack.us/photo/my-images/839/winxpu.png/

我希望有人可以提供帮助。感谢。

1 个答案:

答案 0 :(得分:3)

原来它是WS_EX_COMPOSITED样式和GDI +自定义绘画的组合。如果我启用此标志,则最初在Windows XP上不会显示任何内容。只有在调整大小后,事情才会开始出现。

经过一些研究,我发现它可能是一个错误。但是有一个解决方法

  1. 在内存中创建DIB部分HBITMAP(或者您可以尝试标准的HBITMAP)并将其选择为HDC(查看 CreateCompatibleBitmap CreateCompatibleDC 以及 的选择对象)。
  2. 确保将HBITMAP创建为客户端窗口的大小。
  3. 现在,在调用时使用此“内存”HDC:

    Graphics graphics (m_hDC); 
    
  4. 当GDI +完成绘制到内存HDC时,然后调用BitBlt在pDC上绘制图像。