2012-03-03 107 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