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 |