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;
}
- BeginPaint, EndPaint
case WM_PAINT:
{
hdc = BeginPaint(hWnd, &ps);
Rectangle(hdc, 10, 10, 100, 100);
EndPaint(hWnd, &ps);
return 0;
}
결과의 이유
그림을 그리는 영역의 크기에 따른 차이가 아니라 플래그 메시지인 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 |