2013-06-15 4 views
1

내가 메인 윈도우의 WM_PAINT 메시지 처리기에 다음 코드를했다 : 나는 비트 블리트는 메모리 비트 맵 메모리 DC에 보내고있는 이유C++에서 WM_PAINT의 코드를 디버깅하는 방법은 무엇입니까?

void BossController::paint (HWND hwnd, HBITMAP skin) 
{ 


PAINTSTRUCT ps; 
HDC hdc; 



hdc = BeginPaint (hwnd, &ps); 

    HDC dcSkin = CreateCompatibleDC (hdc);        // memory dc for skin 

    HDC hMemDc = CreateCompatibleDC (hdc);        // memory dc for painting 

    HBITMAP hmemBmp = CreateCompatibleBitmap (hdc, width, height );  // Create bitmap to draw on 

    HBITMAP hOldMemBmp = (HBITMAP)SelectObject (hMemDc, hmemBmp);  // select memory bitmap in memory dc 

    HBITMAP hOldSkinBmp = (HBITMAP)SelectObject (dcSkin, skin); //select skin bitmap in skin memory dc 


     BitBlt (hMemDc, 0, 0, width, height, dcSkin, 0, 0, SRCCOPY);  // Paint Skin on Memory DC 
     BitBlt (hdc, 0, 0, width, height, hMemDc, 0, 0, SRCCOPY);   // Paint Skin on Window DC 


    DeleteObject (hOldSkinBmp); 
    DeleteObject (hOldMemBmp); 
    DeleteObject( hmemBmp); 
    DeleteDC (hMemDc); 
    DeleteDC (dcSkin); 

EndPaint (hwnd, &ps); 


}; 
, 즉 나는 피부 aswell에 텍스트를 그림됩니다

있어 이 스트레이트 페인팅 (직접 hdc)도 시도했지만 아무도 작동하지 않았고 디버깅 방법을 잘 모릅니다. 내가 확인할 수있는 유일한 것은 LoadBitmap 함수의 반환 값과 BossController :: paint (HWND hwnd, HBITMAP 스킨)의 NULL에 대해 스킨을 검사하는 것이 었습니다. 그리고 BitBlt의 반환 값.

항상 창을 만들 때 선택한 배경색으로 사각형이 표시됩니다. (창은 사용자가 그렇게 한 스킨이 적용된, 어떤 제목 표시 줄 등이 없을 것입니다.

사람이 오류를 지적 할 수있는 경우 또는를 디버깅하는 방법?

+3

삭제 코드가 잘못되었습니다 ... 'hOld *'비트 맵을 삭제하지 마십시오. 대신 삭제하기 전에 DC로 다시 선택하십시오. 나는 그것이 당신의 문제라고 생각하지 않습니다. – rodrigo

+0

@rodrigo 함수를 반환하기 전에 궁극적으로 DC를 삭제할 것이므로 메모리를 DC로 사용하기 때문에 다시 선택해야합니까? – StudentX

+1

+1 제목 : –

답변

2

그것은 아무도이 대답없는 것처럼 보이는 어쩌면 잠재적 인 함정 또는 .

첫째을, 하나는 그림을 시작하기 전에 당신이 사용중인 프레임 워크 모르겠지만, 일반적으로 몇 가지 검사가 일반적인 페인트 핸들러처럼 뭔가를 시작합니다.

RECT r; 
if (GetUpdateRect(&r) == 0) 
{ 
    // Nothing to paint, exit function. 
    return 0; 
} 

PAINTSTRUCT ps; 
HDC hdc = BeginPaint(hwnd, &ps); 

if (hdc == 0) 
{ 
    // No display device context available, exit function. 
    return 0; 
} 

둘째, I '피부'가 무엇인지 모르겠다. (HBITMAP,하지만 나는 모른다. 어떻게 만들어 졌는지, 어디에서 왔는지, 크기와 비트 깊이는 무엇인지)

셋째, 정리가 올바르지 않습니다. 항상은 이전에 선택된 비트 맵, 펜, 브러시 등을 복원하기 위해 SelectObject를 호출합니다. 그런 다음 생성 한 항목에 대해 DeleteObject를 호출하십시오.

디버깅 방법은 페인트 처리기에서 문제가 발생하면 항상 최소한으로 제거하고 기능을 확인하고 중단 될 때까지 추가해야합니다. 이 경우 기존 코드를 모두 채워진 단순한 직사각형으로 바꾸고 그 코드가 작동하는지 확인합니다. 그런 다음 BitBlt를 펑키 한 색상의 맨 위에있는 '스킨'비트 맵에서 직접 수행하고 작동하는지 확인하십시오.

GDI 프로그래밍에서 가장 일반적인 오류는 잘못된 좌표 (예 : 클라이언트 좌표 대신 창 좌표, BitBlt 호출에서 잘못된 오프셋을 소스에 제공), 올바르게 리소스를 만들지 못함 (예 : CreateCompatibleDC를 호출 한 다음 새 DC를 사용하여 CreateCompatibleBitmap을 호출하여 단색 비트 맵을 만듭니다.) 또는 제대로 정리하지 못했습니다 (예 : 새로 만든 DC를 삭제하기 전에 이전 리소스를 선택하지 않은 방식). WM_PAINT 핸들러가 충돌을 일으키지 않도록 올바르게 다시 그리기도 시작하지 않는 것이 일반적입니다. 첫 번째 단계는 항상 코드가 실행 중인지 확인하기위한 중단 점입니다.

관련 문제