,所以我畫一個位圖,我的繼承人代碼後沒有顯示出來: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);
更新我的示例代碼來表示這個。
請讓我們看看這段代碼在哪裏。我希望它是在一個WM_PAINT處理程序中,並且該hdc來自BeginPaint。 –
@DavidHeffernan是的,它在'WM_PAINT'中,並且hdc確實來自於BeginPAint。 – Josh
您的編輯沒有幫助。一個最小的複製將。 –