그림 후 표시되지 않습니다 :WM_PAINT 그래서 내가 비트 맵 그림있어, heres는 내 코드를
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);
은 때때로, 나는이 코드를 칠 때, 비트 맵이 표시되지 않습니다. 창을 최소화/최소화하지 않더라도 비트 맵이 표시됩니다. 내 코드에는 문제가 없으므로 내가해야 할 일이있을 것이라고 확신한다.
편집 :
는/unminimized 최소화 될 때까지 내가 TextOut
때로는 표시되지 않는 것 텍스트를 그릴 경우, 그냥 비트 맵 아니다 밝혀졌습니다. 나는 minimizing/unminimizing이 다른 WM_PAINT
메시지를 보냈다는 것을 생각하지 않는다. 그래서 나는 그것을 할 때 그것이 올바르게 다시 그려지는 것을 생각하지 않는다.
오, 나머지 컨트롤은 정상적으로 그려지기 때문에 WM_PAINT 안의 내용은 채색되지 않습니다.
업데이트
다음은 문제의 원인이되는 코드입니다. 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
문 내부 및 페인트의 경우는 true. 그리고이 변수는 다른 스레드에서 설정하고 변수를 설정 한 후에는 InvalidateRect(hMainWnd, NULL, TRUE);
을 호출합니다.
이를 나타 내기 위해 예제 코드가 업데이트되었습니다.
이 코드의 위치를 알려주십시오. WM_PAINT 핸들러 안에 있고 hdc가 BeginPaint에서 왔으면합니다. –
@DavidHeffernan 네, 그것은'WM_PAINT' 안에 있고, hdc는 BeginPAint에서 왔습니다. – Josh
편집이 도움이되지 않습니다. 최소한의 재생산은 가능할 것입니다. –