본문으로 바로가기

[VC++] 캡쳐 이미지를 엑셀 파일로 저장하기

category 개발언어/c++ 2016. 7. 16. 21:42

 

우선 윈도우를 클립보드로 캡쳐한다.

인자로 현재 활성화된 윈도우의 포인터를 넘겨줬다.

void CTestCaptureDlg::CopyWndToClipboard( CWnd *pWnd )
{
CBitmap bitmap;
CClientDC dc(pWnd);
CDC memDC;
CRect rect;

memDC.CreateCompatibleDC(&dc);

pWnd->GetClientRect(rect);

bitmap.CreateCompatibleBitmap(&dc, rect.Width(),rect.Height() );

CBitmap* pOldBitmap = memDC.SelectObject(&bitmap);
memDC.BitBlt(0, 0, rect.Width(),rect.Height(), &dc, 0, 0, SRCCOPY);

pWnd->OpenClipboard() ;
EmptyClipboard() ;
SetClipboardData (CF_BITMAP, bitmap.GetSafeHandle() ) ;
CloseClipboard () ;

memDC.SelectObject(pOldBitmap);
bitmap.Detach();
}

다음으로 클립보드에 있는 비트맵 이미지를 엑셀에 저장해야 하는데 이때, 엑셀 오토메이션을

이용한다. 오토메이션은, 간단히.... 오피스같은 COM기반 application을 type library를 통하여 제어한다고 생각하면 될 것 같다.

엑셀 2003은 object library가 excel.exe에 내장되어 있으므로 여기서 라이브러리를 가져와야 한다. 자세한 것은 아래 문서 참고

<How to create an automation project using MFC and a type library>

이제 라이브러리를 가져왔다면 코딩이 남았다.

아래는 위의 코드에서 캡쳐한 활성 윈도우를

엑셀파일 첫번째 워크시트의 A3셀을 기준점으로 붙여넣기 하며,

A1셀에 텍스트 속성으로 "00000011"이란 문자열을 집어넣고

파일을 열어두는 코드이다.

void CTestCaptureDlg::SaveToExcel()
{
COleVariant vTrue((short)TRUE),
vFalse((short)FALSE),
VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

_Application objApp;
_Workbook objBook;
_Worksheet objSheet;
Workbooks objBooks;
Worksheets objSheets;
Range objRange;

if (!objApp.CreateDispatch("Excel.Application"))//Create Excel application
{
AfxMessageBox("Cannot start Excel");
return;
}
objApp.SetVisible(TRUE);
objApp.SetUserControl(TRUE);

objBooks = objApp.GetWorkbooks();
objBook = objBooks.Add(VOptional); //엑셀 파일을 새로 생성
objSheets = objBook.GetWorksheets();
objSheet = objSheets.GetItem(COleVariant((short)1));

objRange = objSheet.GetRange(COleVariant("A1"),COleVariant("A1")); //A1셀
objRange.SetNumberFormat(COleVariant("@")); //텍스트 속성
objRange.SetFormula(COleVariant("00000011"));

objRange = objSheet.GetRange(COleVariant("A3"),COleVariant("A3"));
objRange.Select();

objSheet.PasteSpecial(COleVariant("비트맵"), VOptional,VOptional,VOptional,VOptional,

VOptional,VOptional); //클립보드의 비트맵을 paste한다.

objApp.ReleaseDispatch();
}