7.1 GDI와 DC의 개념
1) 그래픽 디바이스 인터페이스 (GDI: Graphics Device Interface)
그래픽을 출력하고자 하는 애플리케이션은 윈도우에게 요청을 하고, 윈도우는 디바이스 드라이버를 호출하면 디바이스 드라이버가 하드웨어를 구동시킨다. 하드웨어의 종류와 관계 없이 항상 같은 명령어를 이용하여 그래픽을 출력할 수 있다. 이때, 윈도우가 하드웨어를 제어할 수 있도록 애플리케이션에 제공하는 모든 기능을 그래픽 디바이스 인터페이스라고 한다.
즉, 그래픽 디바이스 인터페이스는 애플리케이션과 디바이스 드라이버의 중간 다리 역할을 하는 것으로 애플리케이션에 대한 장치 독립적인 그래픽 동작을 수행한다.
2) 디바이스 컨텍스트 (DC: Device Context)
윈도우 프로그램은 윈도우의 화면에 출력되는 모든 내용을 DC를 이용하여 출력하게 된다. DC는 그래픽 객체들의 속성과 그래픽 모드를 정의하는 자료의 집합체로 출력 장치에 정보를 표시할 때 필요한 정보를 저장하는 자료구조이다.애플리케이션과 출력 장치를 연결하는 역할을 하며 애플리케이션이 출력에 대한 허가를 받도록 하고, 그려지는 영역을 결정하는 역할을 한다. 하드웨어 독립적인 출력을 할 수 있어 출력 장치에 상관없이 같은 방법으로 출력을 설정할 수 있게 해준다. DC를 얻는 방법
- OnDraw() 함수나 OnPaint() 함수를 이용하는 방법: OnDraw() 함수에서 인자로 넘어온 CDC 클래스를 받거나 OnPaint() 함수에서 CPaintDC 클래스를 받아 이용
- 화면의 변화가 생겼을 때 계속해서 OnDraw() 함수나 OnPaint() 함수를 호출하므로 윈도우의 크기가 변하거나 다른 프로그램으로 가려졌다가 다시 출력되어도 화면 출력이 변하지 않음
- GetDC() 함수를 이용하는 방법: GetDC() 함수를 이용하여 CDC 클래스의 인스턴스를 포인터 형태로 넘겨받아 이용
- 이 방법으로 DC를 얻는 것은 일시적인 것으로 윈도우의 크기가 변하면 출력된 내용이 사라짐
- 화면의 변화가 생겼을 때 WM_PAINT 메시지가 호출되고 OnDraw() 함수나 OnPaint() 함수가 호출되면서 화면이 갱신되기 때문
- CClientDC 클래스를 이용하는 방법: CClientDC 클래스는 생성자 함수에서 GetDC() 함수를 호출하고 소멸자 함수에서 ReleaseDC() 함수를 호출함
- 이 방법도 DC를 얻는 것은 일시적인 것으로 윈도우 크기가 변하면 출력한 내용이 사라짐
- CWindowDC 클래스를 이용하는 방법: 위의 3가지 방법은 클라이언트의 영역을 얻는 방법인 반면, CWindowDC 클래스는 클라이언트의 영역이 아닌 윈도우 영역에 그래픽을 출력하고자 할 때 이용
7.2 GDI 객체
GDI 객체는 화면에 그림을 그리거나 문자를 출력할 때 사용하는 객체를 의미한다. 즉 펜, 브러쉬, 폰트, 비트맵 등을 핸들링하는 핸들을 GDI 객체라고 하며 이 GDI 객체의 핸들을 가지고 있는 클래스를 GDI 객체 클래스라 한다.
GDI 객체 | GDI 객체 클래스 | 기본 값 | 사용 용도 |
펜 | CPen | 검은색, 실선, 1픽셀 크기 | 점, 선, 테두리 |
브러쉬 | CBrush | 무늬 없는 흰색 | 내부 채우기 |
폰트 | CFont | 시스템 폰트 | 문자의 폰트 |
비트맵 | CBitmap | 없음 | 비트맵 출력 |
영역 | CRgn | 없음 | 영역 만들기, 변경하기 |
팔레트 | CPallete | 없음 | 팔레트 조작 |
GDI 객체 사용법
1. GDI 객체 생성 > GDI 객체 클래스의 Create() 계열 함수 이용
2. 객체를 DC에 등록시킴 > SelectObject() 함수 이용 (DC를 쓰고 난 다음 원래 상태로 복원하기 위해 기존에 설정된 객체를 포인터로 받아둠)
3. DC를 사용하여 그래픽을 출력함
4. 이전 객체로 되돌림 > DC를 원래 상태로 복원
5. 객체를 삭제함 > GDI 객체 클래스의 DeleteObject() 함수 이용
GDI 객체에서 가장 많이 쓰이는 펜, 브러쉬, 비트맵, 폰트
1) 펜 (Pen)
- CPen 클래스를 이용하는 객체로 선이나 영역의 경계선을 그릴 때 사용
- 선의 두께, 선의 색상, 선의 스타일을 설정할 수 있음
① 펜 생성 ex) CPen pen, *oldpen; pen.CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
② 펜을 DC에 등록 ex) oldpen = pDC->SelectObject(&pen);
③ DC를 사용하여 그래픽을 출력함 ex) pDC->Ellipse(0, 0, 10, 10);
④ 이전 펜으로 되돌림 ex) pDC->SelectObject(oldpen);
⑤ 펜을 삭제함 ex) pen.DeleteObject();
2) 브러쉬(Brush)
CBrush 클래스를 사용하는 객체로 영역의 내부를 채울 때 사용되며, 채울 색, 패턴 등이 설정된다. 브러쉬 종류에는 솔리드 브러쉬와 해치 브러쉬가 있다.
- 단일 색으로 칠하는 솔리드 브러쉬 생성: CBrush brush, *oldbrush; brush.CreateSolidBrush(RGB(0, 0, 0));
- 일정한 패턴을 가진 해치 브러쉬 생성: CBrush brush; brush.CreateHatchBrush(HS_CROSS, RGB(0, 0, 0));
3) 비트맵 (Bitmap)
비트맵은 CBitmap 클래스를 이용하는 객체로 비트맵을 생성하거나 읽어서 비트맵을 출력할 때 사용한다.
① 화면 DC와 메모리 DC를 생성함 ex) CClientDC dc(this); CDC memdc;
② 화면 DC와 호환성을 갖는 메모리 DC를 가짐 ex) memdc.CreateCompatibleDC(&dc);
③ 비트맵을 읽어옴, LoadBitmap() 함수의 안자로 비트맵의 ID를 입력함 ex) Cbitmap bitmap, *oldbitmap; bitmap.LoadBitmap(IDB_BITMAP1);
④ 메모리 DC에 비트맵을 설정함 ex) oldbitmap = memdc.SelectObject(&bitmap);
⑤ 비트맵 블록을 전송함 ex) dc.BitBlt(0, 0, 450, 85, &memdc, 0, 0, SRCCOPY);
⑥ DC를 복원함 ex) memdc.SelectObject(oldbitmap);
4) 폰트 (Font)
폰트는 CFont 클래스를 이용하는 객체로 문자를 출력할 때 사용하며 글자의 모양, 크기가 설정된다.
- 논리적인 폰트: 이상적인 폰트에 대한 표현으로 실제로 존재하는 것은 아니며, 가장 유사한 물리적인 폰트를 얻기 위해 사용함
- 물리적인 폰트: 실제로 시스템에 설치되어 있는 폰트를 의미하고 실제로 화면에 나타냄
① 텍스트 출력 함수
- TextOut(): DC에 선택된 폰트를 참조하여 지정된 위치에 문자열을 출력
- TabbedTextOut(): TextOut() 함수에 탭 위치를 지정하는 기능이 추가된 함수
- ExtTextOut(): TextOut() 함수의 기능에 문자열이 출력될 영역의 범위를 지정하는 기능이 추가된 함수
- DrawText(): 지정된 사각형 안에 문자열 출력
② 텍스트의 모양에 영향을 미치는 속성을 지정하는 함수
- SetTextColor(): 배경색은 그대로 두고 텍스트의 색상을 설정
- SetBkColor(): 텍스트의 배경색을 설정
- SetBkMode(): 텍스트가 출력될 때 사각형으로 텍스트를 둘러싸는 배경색을 설정
- SetTextAlign(): 텍스트의 정렬 방법을 지정
'New > MFC 윈도우 프로그래밍' 카테고리의 다른 글
6. 사용자 인터페이스 (0) | 2025.01.19 |
---|---|
5. 도큐먼트 파일 입출력 및 템플릿 (2) (0) | 2024.12.29 |
5. 도큐먼트 파일 입출력 및 템플릿 (1) (0) | 2024.12.19 |
4. 대화상자 (2) (1) | 2024.12.15 |
4. 대화상자 (1) (0) | 2024.12.15 |