GDI (Graphic Device Interface)


- Windows 운영체제는 그리기에 필요한 요소들을 여러개의 객체로 구성하고 종속적인 개념(그래픽 장치에 따라 수정되어야 할 것)들을 해당 객체에 숨겼는데 그것이 GDI Object 이다.


대표적인 Ex)

- Bitmap : 비트 패턴 추상화

- Pen : 선 그리기에 사용

- Brush : 내부 영역 채우기


- 현재 그림을 그리는데 사용중인 GDI Object들을 관리(저장) 하는 객체가 필요 -> 그게 DC


DC (Device Context) 


정의

- DC는 출력에 필요한 모든 정보를 가지는 구조체이며 모든 출력 함수는 DC를 참조하여 출력을 내보낸다.

- DC에는 그리기에 필요한 여러가지 정보가 저장되어 있으며 프로그램은 DC의 정보를 참조하여 그리기 하고 

DC의 정보를 조작하여 그리는 방법을 변경한다.

- " DC는 그냥 구조체이다. "

> 구조체 안에는 각종 멤버 함수들이 정의되어 있는데

> 이 함수들은 '하나의' 윈도우에 대한 그래픽 정보이다. 

- D의 Device를 하드웨어 장치가 아니라 '하나의 윈도우'라고 해석하면 편할듯?  


DC 작성하는 함수 - GetDC(HWND hWnd)

- hWnd(or 화면 전체)에 알맞는 DC 만들어서 hdc에 대입하고 hdc 이용해서 윈도우에 그리기를 한다.

HDC hDC = ::GetDC(NULL);  // 화면 전체

HDC hDC = ::GetDC(hWnd);  // 특정 window (Picture Control이라고 생각하자)

Rectangle(hDC, 50, 50, 100, 100);  // 사각형 그리기 


DC 해제하는 함수 - ReleaseDC(HWND nWnd, HDC hDC)

::ReleaseDC(hWnd, hDC);


HDC와 CDC 


- 이 둘의 정확한 차이는 모르겠고 음... 

HDC를 이용해 DC를 받아오고 그 HDC를 CDC에 넣어 편리하게 관리하는 개념인듯 ? 

- CDC는 Class

- CDC 객체는 디스플레이 또는 프린터와 같이 윈도우 클라이언트 영역과 관련된 디스플레이 컨텍스트와 관계된 작업을 수행하기 위한 멤버 함수를 제공 

- MSDN

https://msdn.microsoft.com/ko-kr/library/fxhhde73.aspx


CDC 대표 함수 


1. BitBlt (고속복사)

- 메모리 DC의 비트맵을 현재 DC(화면 DC)에 고속복사한다.

- 완전히 다른 Color Format을 가지는 DC 끼리는 비트맵을 전송할 수 없다. (흑백 예외)

BOOL BitBlt(
int x,// 비트맵이 출력될 클라이언트 윈도우 기준 표준
int y,
int nWidth,// 출력될 비트맵의 폭과 넓이
int nHeight,
CDC* pSrcDC,// 메모리 DC
int xSrc,// 메모리 DC의 비트맵을 어느 좌표부터 출력할 건지
nt ySrc,
DWORD dwRop// 출력 스타일 래스터 오퍼레이션 코드
);

2. StretchBlt (확대/축소)

- 이미지를 확대하거나 축소하여 출력하는데 이용. 

- 두 DC간의 면적비에 따라 이미지가 확대되거나 축소된다.

BOOL StretchBlt(
int x,// 비트맵이 출력될 클라이언트 윈도우 기준 좌표
int y,
int nWidth,// 출력될 비트맵의 폭과 높이
int nHeight,
CDC* pSrcDC,// 메모리 DC
int xSrc,// 출력할 비트맵을 어디서 부터 
int ySrc,
int nSrcWidth, // 얼마(크기)만큼 얻어올 것인지 지정 
int nSrcHeight,
DWORD dwRop// ROP 코드
);

- 확대할 때는 원본의 픽셀을 여러번 반복 

! 축소할 때는 원본 픽셀 중 일부를 생략하는데 생략/삽입 계산 방법 

int SetStretchBltMode(int iStretchMode)
     // BLACKONWHITE(STRETCH_ANDSCANS) : AND 논리 연산을 사용한다. 흰색을 생략하고 검정색을 보존한다. 검정색이 우선 보존된다.
     // WHITEONBLACK(STRETCH_ORSCANS) : OR 논리 연산을 사용한다. 검정색을 생략하고 흰색을 보존한다. 흰색이 우선 보존
     // COLORONCOLOR(STRETCH_DELETESCANS) : 생략되는 픽셀을 별도의 논리 연산없이 삭제한다.
     // HALFTONE(STRETCH_HALFTONE) : 복사대상과 복사원의 사각 블록끼리 대입하여 평균 색상을 구한다. 

pDc->SetStretchBltMode(COLORONCOLOR);
pDC->StretchBlt(nX, nY, button.width, button.height, &memDC, 0, 0, BMPWIDTH, BMPHEIGHT, SRCCOPY);

3. TransparentBlt (투명 비트맵 출력)

- 비트맵은 항상 사각형이다. 

> 사각형이 아닌 형태로 비트맵을 출력 해야하는 경우 사용 

예를들어 게임 캐릭터 

BOOL TransParentBlt(
int xDest,
int yDest,
int nDestWidth,
int nDestHeight,
CDC* pSrcDC,
int xSrc,
int ySrc,
int nSrcWidth,
int nSrcHeight,
UINT clrTransparent  // 투명 영역 컬러(RGB)

예제

CDC memDC;
memDC.CreateCompatibleDC(&pDC);

CBitmap bmp;
bmp.LoadBitmapA(IDB_ME);

CBitmap *pOldBmp = NULL;
pOldBmp = memDC.SelectObject(&bmp);

BITMAP bmpInfo;

bmp.GetBitmap(&bmpInfo);

pDC->TransparentBlt(0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, &memDC,
                  0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, RGB(0, 0, 0));

memDC.SelectObject(pOldBmp);
memDC.DeleteDC();
bmp.DeleteObject();



출처 : http://2ry53.tistory.com/entry/MFC-CDC-%EC%B6%9C%EB%A0%A5%ED%95%A8%EC%88%98-%EC%A0%95%EB%A6%AC



CDC -> HDC

HDC *hDC;
hDC = pDC->m_hDC;
hDC = pDC->GetSafeHdc();

HDC -> CDC

HDC hDC = GetDC(hWnd);
CDC *pDC = CDC:FromHandle(hDC);
HDC hDC = ::GetDC(this->m_hWnd

'Season.1 > MFC]' 카테고리의 다른 글

OnTimer() - 미완  (0) 2017.12.04
SetDIBitsToDevice() / StretchDIBits()  (0) 2017.12.04

+ Recent posts