WM_PAINT 메시지는 윈도우가 다시 그려져야 할 때마다 호출되게 됩니다. 즉 무효 영역이 있는 경우 호출되게 됩니다. 

다시 말하면 윈도우 프로시저는 클라이언트 영역의 일부가 무효화될 때만 WM_PAINT 메시지를 받습니다.

무효영역이 생기는 경우는 두 가지 입니다.


1. 윈도우 일부가 지워젔을 때(예를 들면 윈도우에 가려졌던 부분이 드러날 때)


2. InvaildateRect함수가 호출 될 때


BOOL InvalidateRect(HWND hWnd, CONST RECT *lpRect, BOOL bErase);  


첫 번째 인자는 다시 그려져야할 윈도우의 핸들입니다.


두 번째 인자는 무효화의 대상이 되는 직사각형 영역입니다. 만약 두 번째 인자에 NULL을 넣는다면 클라이언트 영역 전체가 무효화되게 됩니다. NULL을 넣으면 전체를 다시 그리므로 확실히 그려지겠지만 느립니다. 따라서 속도를 높이려면 변경된 최소한의 영역만을 계산하여 무효화 하는 것이 좋습니다.


세 번째 인자는 무효화되기 전에 배경을 모두 지운 후 다시 그릴 것인지 아니면 배경을 지우지 않고 그릴 것인지를 정합니다. TRUE이면 배경을 지우고, FALSE이면 배경을 지우지 않습니다.



윈도우즈는 내부적으로 각 윈도우에 대해 '그리기 정보 구조체(paint information structure)'를 유지합니다. 이 구조체 안에 여러 정보 중에는 무효 영역을 감싸는 최소 크기의 직사각형 좌표(invalid rectangle)이 들어 있습니다. 

* 그리기 정보 구조체 == PAINTSTRUCT

* invalid rectangle == rcPaint


이 무효 직사각형이 우리가 그려야 할 영역입니다. 


만약 대기 중인 WM_PAINT 메시지를 우도우 프로시저가 처리하기 전에 또 다른 부분이 무효화된다면, 윈도우즈는 두 개의 무효 영역을 포함하는 새로운 무효 영역을 그리기 정보 구조체에 갱신합니다. 즉, 윈도우즈는 메시지 큐에 두 개 이상의 WM_PAINT 메시지를 넣지 않습니다.


클라이언트 영역의 무효 영역 전체가 유효화된다면, 메시지 큐에 현재 저장되어 있는 WM_PAINT는 제거됩니다.




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

입력 1. 키보드  (0) 2016.11.16
DC(Device Context)  (0) 2016.11.13