API-DC(Device Context),WM_PAINT

DC의 개념에 대해서 알아보자.

1. 동적 연결 라이브러리

=> 윈도우즈에는 세가지 동적 연결 라이브러리로 구성되있다.
KERNEL : 메모리를 관리하고 프로그램을 실행시키는 라이브러리
USER : 유저 인터페이스와 윈도우를 관리하는 라이브러리
GDI : 화면처리와 그래픽을 담당하는 라이브러리


2.DC란?
=>
1) Device Context 의 약자로 출력에 필요한 모든 정보를 가지는 데이터 구조체
2) 즉, DC는 그리기에 필요한 다양한 정보들의 저장소 역할을 함.!
3) GDI 모듈에 의해 관리된다. (폰트, 선의 색상 굵기, 무늬 그리기 모드 등등 )
4) DC는 그리기 함수들이 참조하는 원점(윈도우 활성역역 left,top부분)의 정보도 제공함
5) DC는 윈도우끼리의 출력 결과가 서로를 방해하지 않도록 완충 역할도 함
6) WM_PAINT 메시지에서 보통 사용된다. 


3.WM_PAINT메시지
WM_PAINT에 대해서 알아보자. 

윈도우의 작업 영역중 일부가 무효화되어 있을 때 시스템이 이 메시지를 큐에 넣어준다. 다음과 같은 경우에 무효 영역이 설정되며 이때마다 WM_PAINT메시지가 전달된다.

① 윈도우가 처음 생성되었을 때 
② 윈도우의 위치가 이동되었을 때 
③ 윈도우의 크기가 변경되었을 때. 최대, 최소화되었을 때 
④ 다른 윈도우에 가려져 있다가 드러날 때 
⑤ 스크롤 될 때 

또는 응용 프로그램 내부에서 InvalidateRect 함수 호출에 의해 강제로 무효 영역을 설정할 수 있다.
 

WM_PAINT 메시지는 모든 메시지 중에 우선 순위가 가장 늦다. GetMessage 함수는 메시지 큐에 WM_PAINT가 있더라도 다른 메시지가 대기중이면 이 메시지를 먼저 처리한다.   


Uncover
: 다른 윈도우에 의해 가려졌다가 다시 나타나면 지워지는 현상.

(운영체제가 개별 윈도우의 화면을 보관 및 복구해 주지 않는다.)
=>지워질때마다 WM_PAINT 메시지를 넘겨주면 해결됨. (적절히 invalidate()를 사용) 


4. DC를 얻는 방법 2가지
 
HDC GetDC(HWND hWnd);
int    
ReleaseDC(HWND hWnd,HDC hDC); 

DC는 주로 하나의 윈도우와 연관되는 출력정보를 가진다. 그래서 인수로 어떤 윈도우에 대한 DC가 필요한가를 밝혀주어야 한다. GetDC는 hWnd가 가리키는 윈도우에 적당한 DC를 만들어 그 핸들을 반납한다. 
DC도 메모리를 차지하므로 할당 후 해제 원칙이 반드시 준수되어야 한다.


HDC BeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint);
BOOL EndPaint(HWND hWnd,CONST PAINTSTRUCT *lpPaint); 


 DC를 얻는 두번째 방법은 WM_PAINT 메시지 루틴에서만 사용할 수 있다.  
BeginPaint는 WM_PAINT 메시지내에서 그림 그리기 준비를 하는 좀 더 전문적인 함수이다.
 BeginPaint 함수는 윈도우 핸들 외에도 페인트 정보 구조체를 인수로 요구하며 이 구조체는 그림 그리기에 필요한 정보를 담는다.

typedef struct tagPAINTSTRUCT
{
    HDC         hdc;
    BOOL        fErase;
    RECT        rcPaint;
    BOOL        fRestore;
    BOOL        fIncUpdate;
    BYTE        rgbReserved[16]; 
} PAINTSTRUCT; 

이 글을 공유하기

댓글

Designed by JB FACTORY