2012-03-03 161 views
2

我正在使用GDI +呈现登录窗口。它在Windows 7上运行良好,但在Windows XP(具有所有更新的SP3)上的 完全没有输出。在Windows XP上的GDI +问题

代码在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是用下面的代码loded为.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主题/航空被关闭或
  • 当我在Windows XP上拖动窗口出画面,然后返回的图像显示这样的:

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

上窗口输出7

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

输出在Windows XP

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

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

+0

您可能会通过关闭Aero来重现Win7上的问题。从你的代码片段中看不出它的原因。看不到hdc从哪里来。 – 2012-03-03 20:55:36

+0

不要紧,我是否有主题/航空开启或关闭,结果总是相同:(噢和HDC从HDC =调用BeginPaint(HWND来了,&ps); – scetix 2012-03-03 21:20:28

+0

是GDI +正确初始化?(可Win7的做到这一点本身在程序加载...):?? – 2012-03-03 21:45:15

回答

3

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

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

  1. 创建DIB部分HBITMAP(或者你可以尝试一个标准HBITMAP)在内存中,并选择它到HDC(看CreateCompatibleBitmapCreateCompatibleDCSelectObject)。
  2. 确保创建HBITMAP客户端窗口的大小。
  3. 现在,打电话时用这种 “记忆” HDC:

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

+0

必须的WndProc调用::调用BeginPaint(),而不是在OnPaint中/的OnDraw ? – BollMose 2014-09-16 07:51:35