본문 바로가기

[ C/ C++ 프로그래밍 ]/[ WinAPI ]

[Windows Api 정복 정리 ] DC(Device ConText)



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

ㅇ DC(Device ConText)
 - 출력에 필요한 모든 정보를 가지는 데이터 구조체
 - GDI에 의해 관리
 - 어떤 폰트, 색상, 굵기, 출력방법 등이 모두 출력에 필요한 정보

ㅇ 사용예) LineTo
 -  LineTo(hDC,X,Y)   : 선의  색상, 굵기, 모양 등의 정보를 모두 모아 DC에 넣고 DC의 핸들을 넘겨 받아 그린다.
 -  LineTo(hDC,100,100) : 화면에 여러개의 창이 있는 경우 내가 지정한 창을 찾아 LinTo 함수를 실행한다.
 
 
ㅇ 사용예) TextOut

 case WM_LBUTTONDOWN:
  hdc=GetDC(hWnd);
  TextOut(hdc,100,100,"Beautiful Korea",15);
  ReleaseDC(hWnd, hdc);
return 0;

 


 - 문자열을 출력하기전에 GetDC 함수로 DC를 얻고 TextOut 함수로 문자열을 출력한 후 ReleaseDC 함수로 DC를 해체한다.


ㅇ DC를 얻는 방법
 - 화면으로 출력 하기 위해서는 반드시 DC가 있어야 한다.
 - 얻는 방법에는 2가지가 있다.
 
 - 1) 첫번쨰 방법 :  GetDC함수를 사용해서 DC를 얻고 ReleaseDC로 해제
HDC GetDC(HWND hWnd);
int ReleaseDC(HWND hWnd,HDC hDC);

 - 2) 두번째 방법 : WM_PAINT 메시지 루틴에서만 사용가능, GetDC로 얻지 않고 BeginPaint 함수로 얻고 해체할때는 EndPaint 함수를 사용
HDC BeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint);
BOOL EndPaint(HWND hWnd,CONST PAINTSTRUCT *lpPaint);

 - BeginPaint는 WM_PAINT 메시지내에서 그림 그리기 준비를 하는 좀 더 전문적인 함수이다.
 - BeginPaint 함수는 윈도우 핸들 외에도 페인트 정보 구조체를 요구 하며 이 구조체는 그림 그리기에 필요한 정보를 담는다.

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


 - 앞의 세 멤버는 사용자가 사용하는 멤버, 나머지 세 멤버는 윈도우즈가 내부적으로 사용하는 것으로 건드려서는 안됨
 - WndProc 선두에서 PAINTSTRUCT 형의 구조체를 지역 변수로 선언하고 Begint 함수로 호출한후 그 리턴값을 hdc라는 변수에 대입받아
    GDI 함수에 사용하고 EndPaint로 그리기를 종료하면 된다.

 

 ps : 자세한 내용은  www.WinAPI.co.kr 참고