【发布时间】:2012-03-03 20:34:09
【问题描述】:
我正在使用 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/
我希望有人可以提供帮助。谢谢。
【问题讨论】:
-
您可能会通过关闭 Aero 在 Win7 上重现该问题。从您的 sn-p 中看不到原因。看不到 hdc 的来源。
-
不管我是否打开了主题/aero,结果总是一样的 :(。哦,hdc 来自 hdc = BeginPaint(hwnd, &ps);
-
GDI+ 是否正确初始化? (可能是Win7在程序加载时自己做的......):XP中的gdiplusStatus是什么?
-
GDI+ 已初始化,gdiplusStatus 正常。
-
如果添加显式 InvalidateRgn,行为会改变吗?