OS/Windows API

#3 Windows API DC란 무엇인가?

VallistA2014. 8. 20. 17:20

이번에는 DC에 대해서 알아봅시다 (DC 인 사이드 말고..)

API에서는 DC 라는 기능이 존재합니다. 

이 DC 라는 기능은 절대 API에 없어선 안될 기능인데요 과연 이 기능이 무엇일까요?


먼저 이 DC라는 것을 알고 가기전, 윈도우즈의 구성에 대해서 살짝 짚고 넘어갑시다.


윈도우즈는 크게 세가지로 동적 연결 라이브러리를 구성한다 말할 수 있습니다.

 - Kernel : 메모리를 관리하고 프로그램 실행을 담당

 - GDI : 화면 처리와 그래픽을 담당

 - User : User Interface와 Window를 관리


알아 보았는데요, 이 동적 연결 라이브러리들은 왜 존재하게 될까요?


쉽게 생각해봅시다. 만약 동적 연결 라이브러리가 없다면 우리는 화면상에 그래픽을 뿌릴 수 없을 것이며, 그런 작업을 다 수작업으로 해야할 것 입니다.

우리가 쉽게 API를 사용할 수 있는 것도 동적 연결 라이브러리가 있기 때문이죠. 


즉, 동적 연결 라이브러리를 통해서 우리는 쉽고 편하게 코딩을 할 수 있는 환경을 제공받는다. 이것입니다.


그러면 오늘의 DC, DC는 과연 어느 동적 연결 라이브러리에 속해 있을까요?

DC는 GDI 동적 연결 라이브러리에 속해 있습니다.


GDI는 위에서 "화면 처리와 그래픽을 담당" 한다고 했습니다.

그렇다면 예측을 해봅시다.


1. DC는 GDI 즉 "동적 연결 라이브러리" 에 속해 있으므로 그래픽 관련해서 일을 할 것이다.

2. DC는 이미지 관련해서 사용하는 함수 일 것이다.


맞습니다! DC는 출력에 필요한 모든 정보를 가지는 데이터 구조체 입니다!


DC가 무엇이냐 하면

 - 출력에 필요한 모든 정보를 가지는 데이터 구조체 입니다.

 - GDI에 의해 관리가 됩니다.

 - 어떤 폰트, 색상, 굵기, 출력방법등이 모두 출력에 필요한 정보로써 그러한 정보를 다 담고 있습니다.


그렇다면 이 DC를 어떻게 사용하는지 알아봅시다.

 - LineTo(hDC, X, Y)      : 선의 색상, 굵기, 모양 등의 정보를 모두 모아 DC에 넣고 DC의 핸들을 넘겨 받아 그립니다.

 - LineTo(hDC, 100, 100) : 화면에 여러개 창이 있는 경우 내가 지정한 창을 찾아 LineTo 함수를 실행합니다.


이와 같이 첫번째 인자에 hDC 라는 변수가 들어가게 됩니다. 

다른 예를 들어 봅시다.


 hdc = GetDC(hWnd);  //!< GetDC로 현재 DC 핸들값을 가져옵니다.

 TextOut(hdc, 100, 100, "HelloWorld", 20); 

 ReleaseDC(hWnd, hdc);


문자열을 출력하기 전에는 Get DC 함수로 DC 정보를 받고, 그다음에 문자열을 출력하고 ReleaseDC 함수로 DC를 삭제 하시면 됩니다.


이러한 형식으로 사용합니다.


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, LPPAINSTRUCT 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로 그리기 하시면 됩니다.


다음부터는 실전으로 들어가도록 하겠습니다.


댓글

댓글쓰기 폼

VallistA

병특이 끝나서 게임에서 웹으로 스위칭한 프로그래머.
프로그래밍 정보등을 공유합니다.

자고 싶습니다. ㅠㅠ

페이스북    :: 링크
카카오톡    :: kingbye1
Github      :: 링크

궁금한점 문의 주시면 답변드리도록 하겠습니다

VISITED

Today : 98

Total : 400,861

SNS

  • 페이스북아이콘
  • 카카오톡아이콘
  • 트위터아이콘