비트교육/API

API(5) -WM_PAINT에 대해 알아보기!

ballde 2020. 9. 3. 21:23

WM_PAINT에 대해서 다뤄볼 것입니다. 

case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            // TODO: 여기에 hdc를 사용하는 그리기 코드를 추가합니다...
            EndPaint(hWnd, &ps);
        }
        break;

일단 먼저 BeginPaint 로 시작해서 EndPaint 로 끝나는 것이 있다. 

이처럼 세트로 묶여져 있는 것은 대부분 메모리 할당 하고나서 해제해는 함수이다. 

 

 //RECT r;             //사가형의 lefttop, right bottom 
 //SIZE s;             //가로세로 길이  (width, height)(horizontal, vertical)
 //POINT p;            //좌표     //--> 이 3개 구조체는 꼭 알아두기!

이 3개 구조체는 많이 쓰인다고 알아두면 좋다고 했다. 

RECT rt;
     GetClientRect(hWnd, &rt);          //window창 좌상을 0,0
RECT rt2;
     GetWindowRect(hWnd, &rt2);         //모니터의 좌상을 0,0

RECT 구조체를 이용해서 GetClientRect를 이용하면 hWnd(윈도우창)의 좌상을 0,0으로 하는 사각형을 얻을 수 있다. 

WCHAR str[32] = TEXT("호랑이");
int len = wcslen(str);
DrawText(hdc, str, wcslen(str), &rt, DT_LEFT);         
DrawText(hdc, str, wcslen(str), &rt, DT_CENTER);
DrawText(hdc, str, wcslen(str), &rt, DT_RIGHT);

DrawText(hdc, str, wcslen(str), &rt, DT_CENTER | DT_SINGLELINE | DT_VCENTER);
DrawText(hdc, str, wcslen(str), &rt, DT_RIGHT | DT_SINGLELINE | DT_VCENTER);
DrawText(hdc, str, wcslen(str), &rt, DT_LEFT | DT_SINGLELINE | DT_VCENTER);

DrawText(hdc, str, wcslen(str), &rt, DT_SINGLELINE | DT_BOTTOM);
DrawText(hdc, str, wcslen(str), &rt, DT_SINGLELINE | DT_BOTTOM | DT_CENTER);
DrawText(hdc, str, wcslen(str), &rt, DT_SINGLELINE | DT_BOTTOM | DT_RIGHT);
            

DrawText로 윈도우 창에 우리가 쓰고자 하는 Text를 나타낼 수 있다. 

 

코드 3개씩 묶은 것이 그림의 파란색선으로 묶은 것과 매칭된다. 

*주의: 세로로 중간에 하기 위해서는 DT_SINGLELINE이 필요하다. 

 

이번에는 마우스가 움직일 때마다의 좌표 나타내는 예제를 해보겠습니다. 

int mx, my;                   //전역함수에 mx, my를 해준다. 
case WM_MOUSEMOVE: 
    {
        int x = LOWORD(lParam);
        int y = HIWORD(lParam);

        mx = x;
        my = y;
        //프로그래머가 특정 메세지를 발생 시킬 수 있다. --WM_PAINT  만약 없다면 화면 자동 갱신이 안일어남 -WM_PAINT가 발생하지 않아서 
        InvalidateRect(hWnd, NULL, TRUE);
    }

mx, my는 마우스의 좌표 

WM_PAINT는 윈도우가 다시 그려질 때 발생하는데  InvalidateRect 함수로 수동으로 발생시켜준다. 

WCHAR str[32] = TEXT("호랑이");
int len = wcslen(str);

위엣 썼던 이함수를 이용한다. 

wsprintf(str, TEXT("%d %d"), mx,my);
TextOut(hdc, mx, my, str, wcslen(str));

TextOut도 DrawText와 같이 Text를 나타내주는 함수이다. 

TextOut (주체, text의 위치의 x좌표, text의 위치의 y좌표 , str  ,str 크기)

 

여기서 중요한건 InvalidateRect() 함수를 써주는 것이 중요!