< 그리기 정보 비트맵에 저장하기 >

 

윈도우용 프로그램의 그리기는 모두 WM_PAINT 메시지에 모아져야 하며 언제든지 WM_PAINT 메시지가 전달되면 현재

화면에 그려져 있는 상태 그대로 다시 그릴 준비가 되어 있어야 한다.
운영체제에서는 화면에 그려져있는 현재 상태를 알지 못하기 때문에 사용자가 직접 복구할 그리기 정보를 가지고 있어야 한다.

그리기 정보를 저장하는 방법으로는 메모리 비트맵에 그림을 저장하는 방법이 있으며 현업에서 많이 쓰이는 방법이다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
HBITMAP hbit;
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
    HDC hdc, MemDC;
    HBITMAP OldBitMap;
    static int x;
    static int y;
    static BOOL bNowDraw = FALSE;
    PAINTSTRUCT ps;
 
    switch(iMessage) {
    case WM_CREATE:
        hdc = GetDC(hWnd);
        hbit = CreateCompatibleBitmap(hdc, 1024768);
        MemDC = CreateCompatibleDC(hdc);
        OldBitMap = (HBITMAP)SelectObject(MemDC, hbit);
        SelectObject(MemDC, GetStockObject(WHITE_PEN));
        Rectangle(MemDC, 001024768);
        SelectObject(MemDC, OldBitMap);
        DeleteDC(MemDC);
        ReleaseDC(hWnd, hdc);
        return 0;
    case WM_LBUTTONDOWN:
        x = LOWORD(lParam);
        y = HIWORD(lParam);
        bNowDraw = TRUE;
        return 0;
    case WM_MOUSEMOVE:
        if (bNowDraw == TRUE) {
            hdc = GetDC(hWnd);
            MemDC = CreateCompatibleDC(hdc);
            OldBitMap = (HBITMAP)SelectObject(MemDC, hbit);
            MoveToEx(hdc,x,y,NULL);
            MoveToEx(MemDC, x, y, NULL);
            x = LOWORD(lParam);
            y = HIWORD(lParam);
            LineTo(hdc, x, y);
            LineTo(MemDC, x, y);
            SelectObject(MemDC, OldBitMap);
            DeleteDC(MemDC);
            ReleaseDC(hWnd, hdc);
        }
        return 0;
    case WM_LBUTTONUP:
        bNowDraw = FALSE;
        return 0;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        MemDC = CreateCompatibleDC(hdc);
        OldBitMap = (HBITMAP)SelectObject(MemDC, hbit);
        BitBlt(hdc, 001024768, MemDC, 00, SRCCOPY);
        SelectObject(MemDC, OldBitMap);
        DeleteDC(MemDC);
        EndPaint(hWnd, &ps);
        return 0;
    case WM_DESTROY:
        DeleteObject(hbit);
        PostQuitMessage(0);
        return 0;
    }
 
    return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
cs

 

상기 코드는 마우스를 클릭하면서 이동하면 이동 경로에 따라 선을 그리는 코드이다.
WM_MOUSEMOVE 메시지 수신 시마다 화면에 그림을 그리는데, 이 때 비트맵에도 동일한 그림을 그려 저장시킨다.
그리고 WM_PAINT 메시지 처리 시에는 그리기 정보가 저장된 비트맵 이미지를 화면에 출력함으로써 윈도우가 화면 밖으로

벗어나거나 다른 윈도우가 화면을 가리더라도 화면이 지워지지 않고 보여줄 수 있게 된다.

 

메모리 비트맵을 사용하면 어떤 복잡한 형태의 그림이라도 기억할 수 있는 장점이 있으며 속도도 빠르다.
다만 메모리가 조금 많이 드는 것이 단점이긴 하다.

+ Recent posts