본문 바로가기

MFC 인터페이스

스크린샷 찍기

void SaveView()
{
CDC memDC;
CDC ScreenDC;

CBitmap Bitmap;

CPalette Pal;
CRect rcView;

HANDLE hDIB;

HDC hPrintDC = NULL;
HDC iPrintInfo = NULL;

CDC PrintDC, MemDC;
CRect rectPrtBoard;

int nDpi = 0;

// 전체 화면의 크기
int cx = GetSystemMetrics(SM_CXSCREEN);
int cy = GetSystemMetrics(SM_CYSCREEN);

GetWindowRect(&rcView);
CRect m_rect = CRect(0, 0, rcView.Width(), rcView.Height());

ScreenDC.CreateDC("DISPLAY", NULL, NULL, NULL);
memDC.CreateCompatibleDC(&ScreenDC);
Bitmap.CreateCompatibleBitmap(&ScreenDC, cx, cy);

CBitmap* pOldBitmap = pOldBitmap = memDC.SelectObject(&Bitmap);
memDC.StretchBlt(0, 0, cx, cy, &ScreenDC, 0, 0, cx, cy, SRCCOPY);

hDIB = DDBToDIB(Bitmap, BI_RGB, &Pal);

if(hDIB == NULL)
return;

CString strPath;
strPath = "저장경로";

WriteDIB((LPSTR)(LPCTSTR)strPath, hDIB);

GlobalFree(hDIB);
memDC.SelectObject(pOldBitmap);
}

// DDB형식을 DIB로 변환
HANDLE DDBToDIB(CBitmap &bitmap, DWORD dwCompression, CPalette *pPal)
{
BITMAP bm;
BITMAPINFOHEADER bi;
LPBITMAPINFOHEADER lpbi;
DWORD dwLen;
HANDLE hDIB;
HANDLE handle;
HDC hDC;
HPALETTE hPal;

ASSERT(bitmap.GetSafeHandle());
if(dwCompression == BI_BITFIELDS)
return NULL;

hPal = (HPALETTE) pPal->GetSafeHandle();
if (hPal==NULL)
hPal = (HPALETTE) GetStockObject(DEFAULT_PALETTE);

bitmap.GetObject(sizeof(bm),(LPSTR)&bm);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = bm.bmWidth;
bi.biHeight = bm.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = bm.bmPlanes * bm.bmBitsPixel;
bi.biCompression = dwCompression;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
int nColors = (1 << bi.biBitCount);
if( nColors > 256 )
nColors = 0;
dwLen = bi.biSize + nColors * sizeof(RGBQUAD);
hDC = ::GetDC(NULL);
hPal = SelectPalette(hDC,hPal,FALSE);
RealizePalette(hDC);
hDIB = GlobalAlloc(GMEM_FIXED,dwLen);
if(!hDIB)
{
SelectPalette(hDC,hPal,FALSE);
::ReleaseDC(NULL,hDC);
return NULL;
}
lpbi = (LPBITMAPINFOHEADER)hDIB;
*lpbi = bi;
GetDIBits(hDC, (HBITMAP)bitmap.GetSafeHandle(), 0L, (DWORD)bi.biHeight, (LPBYTE)NULL, (LPBITMAPINFO)lpbi, (DWORD)DIB_RGB_COLORS);
bi = *lpbi;
if(bi.biSizeImage == 0)
{
bi.biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8) * bi.biHeight;
if(dwCompression != BI_RGB) bi.biSizeImage = (bi.biSizeImage * 3) / 2;
}
dwLen += bi.biSizeImage;
if(handle = GlobalReAlloc(hDIB, dwLen, GMEM_MOVEABLE))
hDIB = handle;
else
{
GlobalFree(hDIB);
SelectPalette(hDC,hPal,FALSE);
::ReleaseDC(NULL,hDC);
return NULL;
}
lpbi = (LPBITMAPINFOHEADER)hDIB;
BOOL bGotBits = GetDIBits( hDC, (HBITMAP)bitmap.GetSafeHandle(), 0L, (DWORD)bi.biHeight, (LPBYTE)lpbi + (bi.biSize + nColors * sizeof(RGBQUAD)), (LPBITMAPINFO)lpbi, (DWORD)DIB_RGB_COLORS);

if(!bGotBits)
{
GlobalFree(hDIB);
SelectPalette(hDC,hPal,FALSE);
::ReleaseDC(NULL,hDC);
return NULL;
}
SelectPalette(hDC,hPal,FALSE);
::ReleaseDC(NULL,hDC);
return hDIB;
}

// DIB형식의 이미지데이터를 파일에 저장
BOOL WriteDIB(LPTSTR szFileName, HANDLE hDIB)
{
BITMAPFILEHEADER hdr;
LPBITMAPINFOHEADER lpbi;
if(!hDIB)
return FALSE;

CFile file;
if(!file.Open(szFileName, CFile::modeWrite | CFile::modeCreate)) return FALSE;
lpbi = (LPBITMAPINFOHEADER)hDIB;
int nColors = 1 << lpbi->biBitCount;
hdr.bfType = ((WORD) ('M' << 8) | 'B');
hdr.bfSize = (DWORD)GlobalSize(hDIB) + sizeof(hdr);
hdr.bfReserved1 = 0;
hdr.bfReserved2 = 0;
hdr.bfOffBits = (DWORD) (sizeof( hdr )) + lpbi->biSize;
file.Write(&hdr, sizeof(hdr));
file.Write(lpbi, (UINT)GlobalSize(hDIB));
file.Close();

return TRUE;
}

'MFC 인터페이스' 카테고리의 다른 글

폴더 열기  (0) 2013.10.20
폴더내 파일 이름 , 개수 , 용량 구하기  (0) 2013.10.20
CString 관련 함수  (0) 2013.10.20
활성화된 다이얼로그 확인하기  (0) 2013.10.20
리스트 컨트롤 배경 지정 하기  (0) 2013.10.20