HDC, BeginPaint/EndPaint, WM_PAINT, PAINTSTRUCT 개념

* 동적 연결 라이브러리: 편하게 화면에 출력해 주는 것

윈도우 세가지 DLL(동적 연결 라이브러리) 구성
- Kernel: 메모리를 관리하고 프로그램 실행을 담당
- GDI(Graphics Device Interface): 화면 처리, 그래픽 담당
- User: User Interface와 Window 관리

* DC(Device Context)
- API 필수 기능으로 출력에 필요한 모든 정보를 가지는 데이터 구조체
- GDI동적 연결 라이브러리에 속해 있다(GDI 모듈에 의해 관리)
- 폰트, 색상, 굵기, 출력방법, 좌표 에 대한 정보


* DC 필요성 예시1.
    선을 긋기 위해서 시작좌표, 끝좌표, 선의 색상, 굵기, 모양, 그리는 방법 등등 필요
    LineTo(StartX, StartY, EndX, EndY, Color, Width, Shape, ROP, mode,......)
    이런 다양한 인수를 공통 정보로 한곳에 모아놓은 것이 DC이다
    LineTo(hDC,X,Y)  와 같이 간결하게 변화 가능

* DC 필요성 예시2.
    윈도우즈는 여러 프로그램을 동시에 실행하는 멀티 태스킹 시스템
    멀티 테스킹 시스템으로 발생하는 변수(윈도우가 겹친 상황)를 선 그리는 함수가 처리 할 수 없어 DC로 처리



 

* API 핸들(Handle): 운영체제가 식별하기 위한 키값. 32bit 정수형


* HDC(Handle Device Context): DC를 식별하기 위한 키값


* DC 받기, 해제 방법 두가지

방법1) (GetDC / ReleaseDC)
- HDC GetDC(HWND hWnd);
- int ReleaseDC(HWND hWnd, HDC hDC);

방법2) (BeginPaint / EndPaint)
- HDC BeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint);
- BOOL EndPaint(HWND hWnd, CONST PAINTSTRUCT * lpPaint);



* BeginPaint: WM_PAINT 메시지내에서 그림 그리기를 준비하는 전문적인 함수.
                 윈도우 핸들 외에도 페인트 정보 구조체(그림 그리기에 필요한 정보)를 요구


* WM_PAINT
- 작업 영역중 일부가 가려지면(무효화 영역) 다시 그릴때 호출
- 윈도우즈 운영체제는 개별 윈도우 화면을 보관하지 않고, 개별 윈도우가 처리 해야 한다(항상, 모두)
- 무효화 영역이 생겼을 때 프로그램으로 알려 주는 방법이 WM_PAINT
- "작업 영역 일부가 지워졌으니 복구하라" 의 의미


* 무효화 영역(Invalid Region): 해당 윈도우가 다른 윈도우에 가려짐, 최소화, 최대화
- BOOL InvlidateRect(HWND hWnd, CONST RECT *lpRect, BOOL bErase);
- 윈도우 작업영역을 무효화시켜 윈도우즈가 WM_PAINT 메시지를 해당 윈도우로 보내는 함수




* PAINTSTRUCT: 페인트 정보 구조체. 그리기 속도 비약적 향상 가능
typedef struct tagPAINTSTRUCT
{
    HDC         hdc;
    BOOL       fErase;
    RECT       rcPaint;
    BOOL       fRestore;
    BOOL       fincUpdate;
    BYTE       rgbReserved[16];
}PAINTSTRUCT;




* GetDC() 와 BeginPaint() 함수의 차이
- GetDC()는 무효화 영역은 상관하지 않고 DC만 얻고 돌려 줌. 무효화 영역은 계속 무효화 상태로 있기 때문에 WM_PAINT 에서 계속 그리려 시도(리소스 계속 사용)
- BeginPaint()는 무효화 영역을 그리고 나면 무효화 영역이 해제 됨(리소스 사용 완료 후 반환)
- 위 차이 때문에 BeginPaint() 를 사용하는 것이 좋다



댓글