2011-10-03 70 views
1

,所以我畫一個位圖,我的繼承人代碼後沒有顯示出來:WM_PAINT繪畫

hdcMem = CreateCompatibleDC(hdc); 

SelectObject(hdcMem, g_hBitmap); 
GetObject(g_hBitmap, sizeof(bm), &bm); 

BitBlt(hdc, 196 - (bm.bmWidth/2), 90, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY); 

DeleteDC(hdcMem);

有時候,當我使用此代碼畫它,不顯示位圖。儘管如果我最小化/取消最小化窗口,位圖顯示。我很確定我的代碼沒有問題,所以還有什麼我應該做的?

編輯
原來它不只是位圖,如果我TextOut繪製文本有時它沒有顯示,直至其最小化/處於最小化狀態。我不認爲最小化/非最小化發送另一個WM_PAINT消息,所以我不認爲當我這樣做時,它會導致它正確重繪。

哦,其餘的控件正常繪製,只是WM_PAINT裏面的東西沒有被繪製。

UPDATE
這是導致問題的代碼,它工作的時間也是98%。


// This is a global variable 
bool GlobalVar = false; 

// This is a different thread started with _beginthread 
void ThreadExample() 
{ 
    GlobalVar = true; 
    InvalidateRect(hMainWnd, NULL, TRUE); 
    _endthread(); 
} 

case WM_PAINT: 
    hdc = BeginPaint(hWnd, &ps); 

    if (GlobalVar == true) 
    { 
     SetBkMode(hdc, TRANSPARENT); 
     SetTextColor(hdc, 0x0000ff); 

     OrigFont = SelectObject(hdc, g_hLargeFont); 

     GetTextExtentPoint32(hdc, ErrorMsg, lstrlen(ErrorMsg), &sz); 
     TextOut(hdc, 196 - (sz.cx/2), 100, ErrorMsg, lstrlen(ErrorMsg)); 

     SelectObject(hdc, OrigFont); 
    } 

    EndPaint(hWnd, &ps); 
    break;

EDIT2:
另一個重要的細節可能是,在我的實際應用中,這個代碼是一個if語句檢查一個全局變量中,如果其真正的油漆。這個變量是從一個不同的線程設置的,並且在變量設置後,我致電InvalidateRect(hMainWnd, NULL, TRUE);
更新我的示例代碼來表示這個。

+0

請讓我們看看這段代碼在哪裏。我希望它是在一個WM_PAINT處理程序中,並且該hdc來自BeginPaint。 –

+0

@DavidHeffernan是的,它在'WM_PAINT'中,並且hdc確實來自於BeginPAint。 – Josh

+0

您的編輯沒有幫助。一個最小的複製將。 –

回答

2

這段代碼片段(你實際上應該更多地發佈更多細節)的好處是你用全局位圖句柄刪除了臨時DC,它仍然被選中。您需要再次執行SelectObject以取消選擇您的位圖。

你常做這樣的:

HGDIOBJ hPreviousBitmap = SelectObject(hdcMem, g_hBitmap); 
// ... 
SelectObject(hdcMem, hPreviousBitmap); 

此外,錯誤檢查沒有壞處。可能其中一個API調用失敗,重要的是哪一個正確地解決了這個問題。