우선 윈도우를 클립보드로 캡쳐한다.
인자로 현재 활성화된 윈도우의 포인터를 넘겨줬다.
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();
}
'개발언어 > c++' 카테고리의 다른 글
메모리 사용량 알기 (0) | 2016.07.16 |
---|---|
Clipboard 에 문자열 넣고,붙여넣기 (0) | 2016.07.16 |
투명리스트 컨트롤 구현(TransListBox) (0) | 2016.07.16 |
ColorListCtrl(리스트 컨트롤색상) 소스 (0) | 2016.07.16 |
프로세스에 로드된 모든 DLL 보기 (0) | 2016.07.16 |