1. DC란 ?
DC 란 제목에서 보이듯이 Device Context의 약자이다.
출력을 위한 모든 데이터를 가지는 구조체.. 란다 얘가.
2. DC 의 필요성?
DC가 필요한 이유를 설명하자면 예를 들어 선을 그리는 경우 필요한 정보는 좌표만으로 그릴 수 있는게 아니다. 선의 굵기, 종류, 선의 색상 등 많은 정보가 필요하다. 이런 정보들을 한 곳에 모아 관리하는 것이 편리하고 효율적일 것이다. 그래서 DC에 모아 관리하는 것이며 그 다음으로는 좌표를 입력해 선을 긋는다고 했을때 그 좌표는 어디를 기준으로한 좌표일까? 바탕화면? 윈도우즈 프로그램은 혼자서 실행되지 않는다. 또한 화면을 독점적으로 사용하지 않는다. 그렇기 때문에 해당 프로그램의 윈도우를 기준으로 그려야하기 때문에 DC에는 기준에 대한 정보가 들어있다. 이에 추가로 원을 그린다고 가정했을 때 두개의 윈도우 창이 겹쳐져 있는경우 아래에 있는 창에 그렸다면 위에있는 윈도우창에 가려지는 부분은 그려지지 않아야할 것이다. 이런 복잡한 처리를 원 그리기 함수가 직접 한다는 것은 불가능하며 DC를 통해 이런 처리가 가능하다. DC는 현재 상황에서 어떤 영역이 출력 허가된 영역인가를 계산하여 허가된 영역에만 출력을 내보낸다. -출처 : 윈도우즈 API 정복(한빛 미디어)
3. HDC? CDC?
우리가 사용하고자 하는 시스템 리소스(Bitmap, DC, .... 등등) 들은 외부에서 직접적으로 제어가 불가능 하다.
그렇기 HANDLE 이라는 개념을 사용한다. 이떄 DC 를 제어하는 핸들이 HDC 이다.
MFC 에서 출력과 관련된 다양한 정보를 제공해주는 디바이스 컨텍스트(DC)를 제공한다. DC는 응용 프로그램 화면에 출력하는 작업을 처리하기 위한 속성을 정의하고 있는 자료구조인데 MFC 에서는 DC를 관리하기 위한 클래스로 CDC를 제공한다. CDC는 텍스트를 출력하거나 그래픽 이미지를 출력하는 등에 관련된 다양한 멤버함수로 구현되어 있다.
위 설명에서 볼수 있듯이 DC를 MFC 에서 사용하기 편리하도록 캡슐화 해서 만든 클래스가 CDC 이다.
결론적으로 HDC 나 CDC 모두 DC를 제어하기 위한 껍데기 같은 역할이고 실질적인 내용물은 동일하다고
생각되는데.. 맞는건가.. ㅋ
4. CDC 의 파생 클래스
CClientDC
그래픽 관점에서 프로그램의 몸체를 구분해 보면 윈도우의 메뉴, 툴바, 상태창, 캡션바, 외각틀 등과 실제 프로그램의 출력부분으로 나눌 수 있다. 이렇게 실제 출력되는 부분을 화면 클라이언트 영역이라고 하는데 CClientDC는 이런 영역을 제어하는 클래스이다. 즉 CClientDC는 메뉴, 툴바 등을 제외한 View 부분을 제어할 수 있는 방법을 제공한다.
CPaintDC
WM_PAINT 메시지가 발생되면 실행되는 OnPaint 메시지 함수에서 사용하는 DC이다. CPaintDC의 영역은 CClientDC와 같다. 단지 CPaintDC는 OnPaint 메시지 함수 내에서만 사용할 수 있다는 것이 다르다.
CWindowDC
클라이언트영역과 함께 메뉴, 툴바, 상태창, 외각틀 등을 모두 포함한 영역을 윈도우 영역이라 말한다. Windows의 View 영역을 제어하기 위해서는 CClientDC를, 모든 영역을 제어하기 위해서는 CWindowDC를 사용한다.
5. DC 관련 사용가능한 함수들
BOOL TextOutW(int x, int y, const CString &str); // 지정된 위치에 텍스트 출력
int DrawText( CString &str, LPRECT lpRect, UINT nFormat); // 지정된 사각형 안에 텍스트 출력
MoveTo( int x1, int y1 ); or MoveTo( CPoint point ); // 선을 그리는 함수
LineTo( int x2, int y2 ); or LineTo( CPoint point );
Rectangle( int x1, int y1, int x2, int y2 );
Rectangle( LPCRECT lpRect); // 사각형 (LPCRECT = CRect)
Ellipse( int x1, int y1, int x2, int y2);
Ellipse(LPCRECT lpRect); // 원
6. CDC -> HDC 변환
// CDC* pDC 일때
HDC* hDC;
hDC = pDC->m_hDC;
hDC = pDC->GetSafeHdc();
/////////////////////////////////
HDC hdc = :GetDC(hWnd);
CDC *pdc= CDC::FromHandle(hdc);
HDC hdc = ::GetDC(this->m_hWnd) ;
출처 : http://gandus.tistory.com/543
/////////////////////////////////
'Programming > C, C++, MFC' 카테고리의 다른 글
WM_USER 에 대하여. (0) | 2013.08.06 |
---|---|
Dialog based program 에서 Menu 만들기. (0) | 2013.08.06 |
GetDlgItem() 함수를 이용하기 (0) | 2013.07.03 |
Memory Leaks 어디서 누수가 일어나는지 잡아보자.. (0) | 2013.07.01 |
CFileDialog 다중파일 선택하기 (0) | 2013.06.14 |