본문 바로가기

무언가 만들기 위한 지식/Win32/MFC

MFC BMP파일 출력하기(이미지 출력)

기타 다른 프로그램에서는 사진 출력하기 간단했던 것같은데, MFC를 사용하다보니 BMP 외부파일 출력하기 참 귀찮다.
(물론 필자가 MFC도 거의 처음이고 잘 몰라서 그렇다고 생각한다.)

그래서 급하게라도 사용했던 BMP 출력하는 법을 적어본다.

1. OnDraw나 Paint에서 CDC* pDC를 알고 있을때, 해당 DC에 외부 BMP파일을 출력하는 방법
	HANDLE bmp;
	CBitmap cBitmap;
	BITMAP bmpinfo;
	CDC memdc;
	bmp = LoadImage(NULL, "images/foodExplain.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
	cBitmap.Attach( bmp ); 
	cBitmap.GetBitmap( &bmpinfo ); 
	memdc.CreateCompatibleDC(pDC);
	memdc.SelectObject(bmp);
	pDC->BitBlt(x,y,bmpinfo.bmWidth,bmpinfo.bmHeight, &memdc, 0 ,0, SRCCOPY);
 //x,y는 그리는 첫번째 위치
 memdc.DeleteDC();
	cBitmap.DeleteObject();
위와같은 상태는 OnDrawPaint등에서 dc를 알고 있을 경우 출력이 가능하다.

2. Dialog에서 Picture Control을 설정한 상태, 그리고 리소스 뷰에서 BMP파일을 IMPORT한 상태일 경우
	HBITMAP hBmp=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(SUGARBMP),IMAGE_BITMAP,0,0,LR_LOADMAP3DCOLORS);
 //SUGARBMP는 IMPORT된 BMP의 ID
	spices_img1.SetBitmap(hBmp);

3. Dialog에서 Picture Control을 설정한 상태, 그리고 외부 BMP파일 불러오기.

HBITMAP hBmp=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),"images/noIMG.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
img1.SetBitmap(hBmp);
//img1은 Picture Control의 ID, "images/noIMG.bmp"은 파일의 상대경로

결국, Picture Control을 이용하면 아주 코드가 간단해진다.

참고로 BitBlt를 사용하게 되면 크기가 원본 크기는 바뀌지 않고,
특정 Size에서 크기를 고정시키고 싶다면 StretchBlt를 사용하면 된다.

ex) 크기를 고정시키는 예제 [단 CDC * pDC를 알고 있어야 아래 처럼 활용 가능]

 CBitmap cBitmap;
 BITMAP bmpinfo;
 CDC memdc;
	HANDLE bmp = LoadImage(NULL,"image/abcd.bmp",IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
 cBitmap.Attach( bmp ); 
	cBitmap.GetBitmap( &bmpinfo ); 
	memdc.CreateCompatibleDC(pDC);
	memdc.SelectObject(bmp);
	//비트맵 화면 사진크기 맞추기
	pDC->StretchBlt(x,y,cx,cy,&memdc,0,0,bmpinfo.bmWidth,bmpinfo.bmHeight,SRCCOPY);
	memdc.DeleteDC();
	cBitmap.DeleteObject();
 //(x,y)는 시작위치, (cx,cy)는 이미지 크기