본문 바로가기
프로그래밍/MFC

MFC-비트맵 띄우기

by 리뷰하는 (게임)프로그래머_리프TV 2010. 5. 16.




MFC의 비트맵도 API와 매우 흡사하다.

일단 비트맵 리소스를 하나 추가하자.

다음과 같은 비트맵이 있다고 하였을 때,

이제 이 비트맵을 가지고 띄우는 일과, 투명값, 알파값, 사이즈 조정등을 하나하나 해보도록 하자.

기본적으로 리소스에 존재하는 이미지를 띄우는 개념에 대해서는 구지 설명하지 않고,

소스 위주로 보도록 하자.

먼저 프로젝트에 WM_PAINT 메시지를 하나 만들자.

	CDC MemDC;
	BITMAP bmpInfo;

	// dc에 대해 메모리DC를 만들어 준다.
	MemDC.CreateCompatibleDC( &dc );

	CBitmap bmp;
	CBitmap* pOldBmp = NULL;

	// 비트맵 로드
	bmp.LoadBitmap( IDB_BITMAP1 );

	// 비트맵에 정보를 저장
	bmp.GetBitmap( &bmpInfo );

	// 메모리DC에 저장
	pOldBmp = MemDC.SelectObject( &bmp );

	// 메모리 Dc에 있는 비트맵을 화면 DC로 복사, 출력
	dc.BitBlt( 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight,
		&MemDC, 0, 0, SRCCOPY );

	// MemDC를 이전값으로 복원
	MemDC.SelectObject( pOldBmp );​


기본 적인 설명은 주석을 달아 놓았다.
큰 구조 자체는 변화가 없다. MemDC를 생성하고 그 안에 Bitmap을 넣은 후 DC에 MemDC를 복사 하는 방법이다.
BitBlt의 인자는 출력할 윈도우 좌표 x,y
비트맵의 폭과 높이.
출력할 비트맵을 저장한 메모리 DC의 주소
메모리 DC에 들어 있는 비트맵의 시작 좌표
적용할 래스터 연산 이다.

// 실행 화면



두번째로 기본의 이미지를 상태로 크기를 조정하는 예제를 살펴 보자.

다른 부분은 전혀 바뀐게 없다. 단지,

BitBlt의 부분을

	// 메모리 Dc에 있는 비트맵을 화면 DC로 복사, 출력
	dc.StretchBlt( 0, 0, bmpInfo.bmWidth*2, bmpInfo.bmHeight*2,
		&MemDC, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, SRCCOPY );​


로만 변경해 주어도 이미지의 크기가 좌우 2배씩 늘어 난 것을 알 수 있다.

각각의 인자는 BitBlt과 비슷 하지만, 3,4번째 인자로 이미지 확대를 가능케 하고,
8,9번째 인자에 원본 이미지의 폭과 높이를 추가로 지정하는것이 차이점이다.
// 실행 화면



다음으로 이미지에 특정 RGB값에 대해서 투명하게 처리하는 함수를 살펴 보자.

	// 메모리 Dc에 있는 비트맵을 화면 DC로 복사, 출력
	dc.TransparentBlt( 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight,
		&MemDC, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, RGB( 255, 0, 0 ) );​


이전 함수와 차이라고는 마지막 변수에 RGB값을 컬러키로 지정해서 그 부분만 투명하게 한다는 것!
// 실행 화면


마지막으로 알파블랜딩에 대해서 알아 보자.

기존과는 조금 차이가 있는데, 마지막에 들어 가는 인자가 BLENDFUNCTION이라는 구조체에 대한 정보를 삽입하게 된다.

	BLENDFUNCTION bf;

	// 원본 이미지(DC)와 대상 이미지(MemDC)를 섞는 연산을 의미
	// 현재로썬 AC_SRC_OVER만 해준다고 한다.
	bf.BlendOp = AC_SRC_OVER;	
	// 일단 무조건 0 
	bf.BlendFlags = 0;
	// 투명값 조정
	bf.SourceConstantAlpha = 50;	// 0 = 투명, 255 = 불투명
	// 알파블랜딩의 포멧
	bf.AlphaFormat = 0;

	// 메모리 Dc에 있는 비트맵을 화면 DC로 복사, 출력
	dc.AlphaBlend( 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight,
		&MemDC, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, bf );​


// 실행 화면

'프로그래밍 > MFC' 카테고리의 다른 글

MFC-CImage( 스크린 샷 찍기 )  (0) 2010.05.17
MFC-CImage 클래스  (0) 2010.05.17
MFC-가상 버튼 만들기  (0) 2010.05.16
MFC-부채꼴 그리기  (0) 2010.05.16
MFC-도형 그리기  (0) 2010.05.16