2011-10-03 2 views
1

그림 후 표시되지 않습니다 :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);을 호출합니다.
이를 나타 내기 위해 예제 코드가 업데이트되었습니다.

+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 호출 중 하나가 실패하고 중요한 것은 문제에 대해 더 많은 것을 밝히는 것이 중요합니다.