2011-09-26 2 views
1

나는 windows.h (GDI)를 사용하는 C++의 간단한 mspaint와 유사한 프로그램을 작성하고 있습니다. 필자의 프로그램에는 필기 도구 만 필요하다. 그래서, WM_PAINT 메시지에 그려 넣기 위해 메인 윈도우의 그림 (예 : 메모리 HDC와 HBITMAP)을 저장해야합니다.MSPaint 형 앱 쓰기. BitBlt를 올바르게 수행하는 방법?

  1. 처음에 창 HDC를 내 메모리 HDC 및 HBITMAP에 저장해야합니까? 창문을 보관해야하는 메시지는 무엇입니까? 예를 들어 WM_CREATE에서는 아직 창이 없기 때문에 불가능하다고 생각합니다.

  2. PatBlt와 BitBlt의 차이점은 무엇입니까? 내 앱에는 무엇을 사용해야합니까?

  3. 윈도우의 HDC 컨텐츠를 내 메모리 HDC 및 비트 맵에 복사하는 방법은 무엇입니까?

    LPRECT lpRect; 
        GetClientRect(hwnd, lpRect); 
        width = lpRect->right - lpRect->left; 
        height = lpRect->bottom - lpRect->top; 
    
        HDC hDC = GetDC(hwnd); 
        memoryDC = CreateCompatibleDC(hDC); 
        memoryBitmap = CreateCompatibleBitmap(hDC, width, height); 
        SelectObject(memoryDC, memoryBitmap); 
        PatBlt(memoryDC, 0, 0, width, height, PATCOPY); 
        ReleaseDC(hwnd, hDC); 
    

을하지만이 작동하지 않습니다 :이 같은 것을 할 노력하고있어 프로그램이 충돌합니다.

  1. 이후에 WM_PAINT에서 창을 복원하는 방법은 무엇입니까?

  2. 흰색으로 창을 지우는 방법은 무엇입니까?

+0

오류를 확인하는 것으로 시작합니다 (유효한 핸들이 반환됩니까?). – sehe

답변

4

1 : 나는 가능한 한 늦게 오프 스크린 캔버스를 게으른로드하는 것이 좋습니다. WM_PAINT가 필요하고 아직 만들지 않았다면 생성하십시오. 누군가가 그림을 그리는 시점에서 필요하다면 그 그림을 만듭니다. 필요할 때 필요할 경우 사용하십시오.

2 : PatBlt는 장치 컨텍스트의 현재 브러시를 사용하여 비트 맵의 ​​영역을 채 웁니다. 브러쉬는 패턴을 정의하기 때문에 PatBlt라고 불립니다. BitBlt는 원본 비트 맵의 ​​데이터를 대상 비트 맵으로 복사합니다. 오프 스크린 비트 맵에서 프레임 버퍼로 이미지를 이동하려면 BitBlt를 사용합니다.

3 : GetClientRect의 lpRect 매개 변수는 출력 매개 변수입니다. 즉, 메모리를 공급해야합니다. 이 경우 GetClientRect는 널 포인터에 사각형을 쓰려고하고 충돌을 일으키려고합니다.

RECT clientRect; 
GetClientRect(hwnd, &clientRect); 
width = clientRect.right - clientRect.left; 
height = clientRect.bottom - clientRect.top; 
관련 문제