본문 바로가기

Win32 API

12. Win32 API - 무효화 / 유효화 영역

 

1. 윈도우 클라이언트 영역

  • 윈도우의 테두리 영역 또는 제목이 표시되는 캡션 영역은 기본적으로 운영체제가 관리하는 영역입니다.

클라이언트 영역

 

2. 무효화 영역

  • 무효화 영역은 화면에 그려져야 할 내용이 변경되었음을 시스템에 알리는 영역입니다. 이 영역은 대부분의 경우 직사각형 영역으로 표현되며, 윈도우나 컨트롤 내부의 일부분이나 전체가 무효화될 수 있습니다.
  • InvalidateRect() 함수를 호출하여 무효화 영역을 설정합니다. 이 함수들을 호출하면 해당 영역은 유효하지 않은(invalid) 상태가 되어, 윈도우의 내용이 화면에 그려질 때 다시 그려져야 함을 나타냅니다.
    무효화 영역

 

3. 유효화 영역

  • 유효화 영역은 화면에 다시 그려져야 할 영역을 지정하는 영역입니다. 유효화되지 않은 영역은 다시 그려져야 하므로, 시스템은 유효화 영역에 해당하는 부분만 다시 그립니다.
  • ValidateRect() 함수를 호출하여 유효화 영역을 설정합니다. 이 함수들을 호출하면 해당 영역은 유효(valid)한 상태가 되어, 윈도우의 내용이 화면에 그려질 때 다시 그려지지 않습니다.

4. WM_PAINT

https://learn.microsoft.com/ko-kr/windows/win32/gdi/wm-paint

 

WM_PAINT 메시지(Winuser.h) - Win32 apps

시스템 또는 다른 애플리케이션이 애플리케이션 창의 일부를 그리도록 요청할 때 WM\_PAINT 메시지가 전송됩니다.

learn.microsoft.com

무효화 영역이 유효 영역으로 변경되는 경우 응용 프로그램이 스스로 지워졌던 그림을 복구할 수 있도록 복구가 필요한 영역의 정보를 담은 WM_PAINT 메시지를 해당 응용 프로그램에 전달합니다.
무효화는 화면에 그려져야 할 내용이 변경되었음을 시스템에 알리고, 유효화는 다시 그려져야 할 영역을 지정합니다. WM_PAINT 메시지는 유효화된 영역을 다시 그리는 데 사용됩니다.

 

 

WM_PAINT 사용 예시

case WM_PAINT:
    {
    	PAINTSTRUCT ps;
        hdc = BeginPaint(hWnd, &ps);
        // 처리내용 ...
        
        EndPaint(hWnd, &ps);
        return 0;
    }

 

WM_PAINT 메시지의 사용 예시입니다.

 

WM_PAINT 메시지 사용 주의 사항

GetDC 대신에 BeginPaint 함수와 EndPaint 함수를 사용하여 DC를 사용합니다.
매번 윈도우 영역 전체를 다시 그리는 비효율을 감수하더라도 GetDC와 ReleaseDC 함수를 사용하면 시스템의 속도가 느려지게 됩니다.

 

  • GetDC, ReleaseDC
case WM_PAINT:
    {
        hdc = GetDC(hWnd);
        Rectangle(hdc, 10, 10, 100, 100);

        ReleaseDC(hWnd, hdc);
        return 0;
    }

GetDC 사용시

  • BeginPaint, EndPaint
case WM_PAINT:
    {
        hdc = BeginPaint(hWnd, &ps);
        Rectangle(hdc, 10, 10, 100, 100);
        EndPaint(hWnd, &ps);
        return 0;
    }

BeginPaint 사용 시

결과의 이유

그림을 그리는 영역의 크기에 따른 차이가 아니라 플래그 메시지인 WM_PAINT의 동작 원리를 잘못 이해해서 발생하는 문제입니다.
WM_PAINT 메시지는 메시지 테이블에서 자신의 상태 값이 1이면 메시지가 발생했다는 뜻으로 판단해서 WM_PAINT 루틴을 처리하게 됩니다.
그리고 메시지 처리가 끝나게 되면 메시지 테이블에서 자신의 상태 값을 0으로 변경합니다.
BeginPaint 함수에서 WM_PAINT 메시지의 상태 값을 1에서 0으로 변경하는 작업을 수행해줍니다. BeginPaint 함수를 사용하면 자동으로 상태 값이 1에서 0으로 변경되어 다시 WM_PAINT 메시지가 발생할 때까지 대기합니다.
WM_PAINT에서 GetDC함수를 사용하면 그림을 그리는 데에는 문제가 없지만 WM_PAINT 메시지의 상태를 1에서 0으로 변경하지 않기 떄문에 메시지의 상태가 1으로 계속 유지되고 WM_PAINT 메시지가 계속 발동한 것처럼 동작하게 됩니다.

 

5. 참조

https://blog.naver.com/tipsware/221119932350

 

WM_PAINT 메시지에 대하여

: Win32 프로그래밍 관련 전체 목차 http://blog.naver.com/tipsware/221059977193 1. 윈도우의 '클...

blog.naver.com

 

'Win32 API' 카테고리의 다른 글

14. Win32 API - StockObject  (0) 2024.03.09
13. Win32 API - 윈도우 좌표  (0) 2024.03.09
11. Win32 API - Bitmap  (0) 2024.03.02
10. Win32 API - DC 개요  (0) 2024.02.24
9. Win32 API - GDI 개요  (0) 2024.02.24