관리 메뉴

ComputerVision Jack

[MFC - 화면 출력] 본문

Image Processing/MFC Programming

[MFC - 화면 출력]

JackYoon 2020. 8. 18. 20:51
반응형

화면 출력 기초

 

GDI와 디바이스 컨텍스트

윈도우 운영체제는 GUI 기반이기 때문에 도스 같은 텍스트 기반 운영체제보다 훨씬 풍부한 출력 방법을 제공한다.

윈도우 운영체제의 출력 시스템은 다음 사항들을 고려하여 설계되어 있다.

  • 모니터, 비디오 카드, 프린터 등 출력에서 사용되는 주변 장치가 변경되어도 프로그램을 수정할 필요가 없어야한다.
  • 여러 프로그램이 화면을 분할해서 사용하므로 각각의 프로그램이 출력하는 영역에 제약을 가해야한다.

윈도우 운영체제는 GDI(Graphics Device Interface)라는 것을 사용한다. GDI는 윈도우 운영체제의 하위 시스템 중 하나로 DLL로 존재한다.

 

윈도우 화면 출력시 필요한 요구되는 사항

  • 클라이언트 영역에 출력하려면 출력 대상 윈도우의 위치를 알아야한다. 
  • 화면에 여러 윈도우가 있을 때, 한 윈도우의 출력 결과가 다른 윈도우 영역을 침범하지 않아야한다.
  • 현재 출력할 화면이 다른 윈도우에 가려졌다면 출력할 수 없어야한다.

화면 출력 시 고려해야 할 다양한 상황을 해결하고자 윈도우에서는 디바이스 컨텍스트(DC : Device Context) 개념을 사용한다.

 

윈도우 응용프로그램이 WM_PAINT 메시지를 받는 상황

  • 윈도우가 생성될 때
  • 윈도우가 최소화 또는 최대화될 때
  • 윈도우 크기가 변경될 때
  • 다른 윈도우가 가렸다가 드러날 때

WM_PAINT 메시지는 운영체제가 자동으로 생성하지만 응용프로그램이 강제로 무효 영역을 만들어 WM_PAINT 메시지를 생성하는 것이 유용할 때도 있다.

 

CDC 클래스

MFC는 GDI의 다양한 기능을 편리하게 사용할 수 있도록 디바이스 컨텍스트(DC)를 추상화한 CDC 클래스를 제공한다.

 

SDK 프로그램 출력

1. 운영체제에 디바이스 컨텍스트를 요청해서 얻는다

2. 디바이스 컨텍스트를 전달 인자로해서 API 함수를 호출하여 출력한다.

3. 디바이스 컨텍스트 사용이 끝났음을 운영체제에 알린다.

 

MFC 프로그램 출력

1. 디바이스 컨텍스트 객체를 생성한다.

2. 객체의 맴버 함수를 호출하여 출력한다.

디바이스 컨텍스트 클래스(CDC 파생 클래스)

CPaintDC 클래스

CPaintDC 클래스는 WM_PAINT 메시지 핸들러에서만 사용할 수 있고, 클라이언트 영역에만 출력할 수 있는 특징이 있다.

디바이스 컨텍스트는 특정 윈도우에 출력할 때 필요한 정보를 담고 있어야하므로 객체 생성시 대상이 되는 윈도우를 this 포인터를 사용해 뷰 객체의 주소값을 전달해야한다.

 

CPaintDC 예제

CClientDC 클래스

CClientDC 클래스는 WM_PAINT 메시지 핸들러를 제외한 다른 모든 곳에서 사용할 수 있고, CPaintDC 클래스처럼 클라이언트 영역에만 출력할 수 있는 특징이 있다.

CClientDC 예제

CWindowDC 클래스

CWindowDC 클래스는 윈도우 전체 영역(클라이언트 영역 + 비클라이언트 영역)에 출력할 때 사용한다. 기본 사용법은 위 클래스와 같지만 원점 위치가 다르다.

CWindowDC 예제

CMetaFileDC 클래스

메타 파일(meta file)은 그리기 명령의 집합으로서, 메모리에 임시로 생성하거나 디스크 파일에 영구히 저장할 수 있다. 만들어진 메타 파일을 재생하면 저장된 그리기 명령들을 한번에 수행하여 원하는 그림을 그릴 수 있다.

MetaFileDC 예제

그리기 함수

CDC 클래스는 GDI가 제공하는 다양한 그리기 함수를 좀 더 편리하게 사용할 수 있는 멤버 함수를 제공한다.

 

점 찍기

  • GetPixel() : 화면 (x, y) 지점의 색을 얻는다.
  • SetPixel() : 화면 (x, y) 지점에 특정 색상의 점을 찍고 원래 점의 색을 리턴한다.
  • SetPixelV() : SetPixel() 함수와 출력은 같지만 원래 점의 색을 리턴하지 않아 속도가 빠르다.

점찍기 예제

선 그리기

CDC 클래스는 한 번의 호출로 선을 그리는 함수는 제공하지 않기 때문에 두 단계를 거쳐서 그려야한다.

  • MoveTo() : 현재 위치를 (x, y) 위치로 옮긴다.
  • LineTo() : 현재 위치에서 (x, y) 위치까지 선을 그리고, 현재 위치를 (x, y)로 변경한다.
  • Polyline() : POINT 구조체 배열로 전달된 점들을 차례로 이어서 선을 그린다.

선 그리기 예제

도형 그리기

  • Rectangle() : 직사각형을 그린다.
  • Ellipse() : 직사각형에 내접하는 타원을 그린다.
  • RoundRect() : 테두리가 둥근 직사각형을 그린다.
  • Polygon() : POINT 구조체 배열로 전달된 점들을 차례로 이어서 다각형을 그린다.

텍스트 함수

  • TextOut() : (x, y) 위치에 문자열을 출력한다.
  • DrawText() : 직사각형 영역 내부에 문자열을 출력한다.
  • SetTextColor() : 글자의 색상을 바꾼다.
  • SetBkColor() : 글자의 배경색을 바꾼다.
  • SetTextAlign() : 기준 위치에 대한 문자열 정렬 방식을 바꾼다.

텍스트 예제

속성 함수

디바이스 컨텍스트에는 내부적으로 다양한 속성이 있으며, 이 속성에 따라 GDI 출력 함수의 결과가 달라진다.

속성함수 예제

GDI 객체

GDI 객체 (GDI Object)는 GDI에서 출력할 때 사용하는 도구로 여섯가지가 있다.

  • 펜 - 선 그릴 때 - CPen
  • 브러시 - 면의 내부를 채울 때 - CBrush
  • 폰트 - 글자를 출력할 때 - CFont
  • 비트맵 - 그림을 출력할 때 - CBitmap
  • 팔레트 - 출력할 색의 집합을 다룰 때 - CPalate
  • 리전 - 다양한 형태의 면을 정의할 때 - CRgn

펜/브러시/폰트는 특별히 지정하지 않아도 기본 값이 설정되어 있지만, 비트맵/팔레트/리전은 CDC::Select*() 함수로 디바이스 컨텍스트에 선택해줘야 한다.

 

GDI 객체 사용 절차

1. GDI 객체를 지역 변수로 선언하여 스택에 생성한다.

2. 생성된 GDI 객체를 CDC::SelectObject() 함수에 전달하여 디바이스 컨텍스트에 선택한다.

3. CDC 클래스의 다양한 멤버 함수를 호출하여 출력한다.

4. 이전에 임시 변수에 저장해둔 GDI 객체를 CDC::SelectObject() 함수로 선택하여 복원한다.

5. 함수가 끝나면 GDI 객체의 소멸자가 자동으로 호출되어 파괴한다.

 

펜 객체 사용예제
브러시 객체 사용 예제

내장 객체

내장객체는 윈도우 운영체제가 미리 만들어서 제공하는 GDI 객체. 내장 객체는 생성 과정을 생략하고 디바이스 컨텍스트에 선택만 하면 된다. CDC::SelectStockObject() 함수를 사용한다.

내장 객체 예제
비트맵 예제
리전 예제

반응형

'Image Processing > MFC Programming' 카테고리의 다른 글

[MFC - 마우스와 키보드]  (1) 2020.09.15
[MFC - Chapter4 연습문제]  (1) 2020.09.14
[MFC - Chapter3 연습 문제]  (0) 2020.08.17
[MFC - MFC 프로그램 구조]  (0) 2020.08.17
[MFC - Chater2 연습 문제]  (2) 2020.08.06
Comments