ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • DC와 무효화 영역
    Windows Programming/Win32API 란? 2022. 3. 28. 20:42

    DC

    Device Context 란?

    • 출력에 필요한 모든 정보를 가지는 구조체
    • 폰트, 색상, 굵기, 그리기 모드 , 무늬 등 모두 출력에 필요한 정보

    윈도우를 만들고 그림을 그리려면 반드시 DC의 핸들을 얻어야 한다.

    DC는 임의의 장치( 윈도우, 프린터)에 출력을 할 때 사용하는 다양한 속성의 지닌 일종의 구조체 이다.

    사용자는 DC에 출력을 하면 DC가 지닌 여러 속성을 사용 해서 DC가 연결된 장치에 출력된다.

     

    DC는 하나의 메시지를 처리하는 동안 핸들을 얻고 제거해야 한다.

    즉, static 형태로 보관 해서 사용할 수 없다.

     

     

     -DC를 얻고 제거하는 방법들

    DC를 얻고 제거하는 방법들

    [사용 예]

     HDC hdc = GetDC(hWnd);   //각종 출력문에서 hdc를 사용한다.

     

     Rectangle(hdc, 0, 0, 0+100, 0+100);  // 100*100 size의 사각형을 그리는 함수

     

     RelaseDC(hWnd, hdc);

     


    무효화 영역

     

    윈도우가 다른 윈도우에 뒤에 있다가 앞으로 나올 때 다시 그려야 하는 영역무효화 영역이라고 한다.

     

    아래와 같은 경우에 무효화 영역이 발생한다.

     

    - 윈도우를 옮기거나 제거 했을 때 이전에 감추어졌던 윈도우 영역이 보이게 될 때

    - 윈도우의 크기를 조정했을 때

    - 윈도우의 일부에 겹친 DialogBox나 메시지 박스가 제거 될 때

    - 메뉴가 나타났다 사라질 때

     등등.....

     

    WM_PAINT

     

    무효화 영역이 발생하면 운영체제는 WM_PAINT 메시지를 해당 윈도우 프로시져에 보낸다.

    WM_PAINT는 2번 메시지 큐에 들어 오지 않고 단지 이 좌표만이 Update 된다.

    즉, 메시지큐에는 WM_PAINT는 하나 이상 존재 하지 않는다.

     

    WM_PAINT 메시지가 발생 했다는 것 == 무효화 영역이 발생 함

     

    무효화 영역이 발생 했다면 반드시 무효화 영역을 제거 해야한다. // 제거하지 않으면 무한 반복

     

     

    참고로 아래의 코드는 절대로 사용하면 안된다.

     

    case WM_PAINT:

             return 0;

     

    무효화 영역이 유효화 되지 않으므로 WM_PAINT 가 무한반복 호출된다.

     

     

    무효화 영역을 제거 하는 방법

     

    WM_PAINT 메시지 루틴에서 클라이언트 DC를 얻고 사용할 수 있는 방법이다.

    WM_PAINT 메시지 처리 루틴에서는 DC 핸들을 GetDC로 얻지 않고,

    BeginPaint 함수로 얻으며 해제 할 때는 EndPaint 함수를 사용한다.

    정리하면, GetDC는 DC 핸들을 얻는 일반적인 방법이며,

    BeginPaint는 WM_PAINT 메시 지 내에서 사용하는 특수한 방법이다.

     

    [사용 예] 

    {

     PAINTSTRUCT ps;

     HDC hdc = BeginPaint(hWnd, &ps); //각종 출력문에서 hdc를 사용한다.

     EndPaint(hWnd, &ps);

    }

     

     

    BeginPaint는 아래와 같은 일을 한다.

    • DC를 만들고 UpdateRegion을 DC의 Cliping 영역으로 지정한다.
    • 무효화 영역을 지우기 위해 WM_ERASEBKGND 메시지를 보낸다.
    • PAINTSTRUCT 구조체를 채운다.
    • Caret 이 있을 경우 그리기 전에 Hide하고 EndPaint() 에서 Show 한다.
    • 무효화 영역을 유효화 한다.

     


    내가 직접 무효화를 발생 시키는 방법

     

    오른쪽 방향키가 눌릴 때마다 사각형을 x축으로 100만큼 이동 하는 코드

     

    위 코드의 경우 오른쪽 방향키가 눌리면 사각형이 이동 하여야 하지만,

    무효화 영역이 발생하지 않는 한 이동한 사각형이 즉각적으로 화면에 그려지지 않는다.

     

    즉각적으로 내가 원하는 그림을 얻기 위해서는 인위적으로 내가 무효화 영역을 발생 시켜주면 되는데

    InvalidateRect(hwnd, 0, FALSE) 함수가 그 기능을 한다.

     

    InvalidateRect()를 호출 하고 방향키를 이동 했을때 화면

    위와 같이 즉각적으로 그림이 그려진다.

    3번째 인자가 FALSE 이기 때문에 기존에 그림은 지워지지 않는다.

    기존의 그림을 지우고 새로 그리고 싶으면 TRUE를 주면 된다.

    'Windows Programming > Win32API 란?' 카테고리의 다른 글

    PeekMessage()  (0) 2022.03.24
    윈도우 핸들(HWND)  (0) 2022.03.20
    WinMain과 프로시저,메시지큐  (0) 2022.03.18
    win32api란?  (0) 2022.03.11

    댓글

Designed by Tistory.