#include "stdafx.h" #include "ScreenCapture.h" CScreenCapture::CScreenCapture() { m_cxScreen=::GetSystemMetrics(SM_CXSCREEN); m_cyScreen=::GetSystemMetrics(SM_CYSCREEN); m_bIsCapturing = false; } CScreenCapture::~CScreenCapture() { } //功能:屏幕截屏,保存成BMP位图数据 //输入:截屏区域rcCapture void CScreenCapture::ScreenGISArea(const CRect rcCapture) { m_bIsCapturing = false; //功能:开始截屏 BeginCapture(); CRect CapRect = rcCapture; // CapRect.NormalizeRect(); m_bIsCapturing = true; //屏幕截图 HBITMAP hBmp = CopyScreenToBitmap(CapRect); if(hBmp !=NULL) { SaveBitmap(hBmp); } m_bIsCapturing = false; } //功能:截屏给定区域,保存成BMP //输入:截屏区域rect HBITMAP CScreenCapture::CopyScreenToBitmap(CRect &rect) //lpRect 代表选定区域 { CDC tarDC,srcDC; CBitmap tarBmp,*pOldtarBmp,*pOldsrcBmp; if(m_bIsCapturing) { tarDC.CreateCompatibleDC(NULL); srcDC.CreateCompatibleDC(NULL); pOldsrcBmp=srcDC.SelectObject(&m_bkBmp); } else { srcDC.CreateDC("DISPLAY",NULL,NULL,NULL); tarDC.CreateCompatibleDC(&srcDC); } if (rect.left<0) rect.left=0; if(rect.top<0) rect.top=0; if(rect.right>m_cxScreen) rect.right=m_cxScreen; if(rect.bottom>m_cyScreen) rect.bottom=m_cyScreen; tarBmp.CreateCompatibleBitmap(&srcDC,rect.Width(),rect.Height()); pOldtarBmp=tarDC.SelectObject(&tarBmp); tarDC.BitBlt(0, 0, rect.Width(),rect.Height(),&srcDC, rect.left,rect.top,SRCCOPY); if(m_bIsCapturing) srcDC.SelectObject(pOldsrcBmp); tarDC.SelectObject(pOldtarBmp); return (HBITMAP)tarBmp.Detach(); } void CScreenCapture::SaveBitmap(HBITMAP hBmp) { TCHAR szFilters[]= _T("Image Files (*.bmp)|*.bmp||"); CFileDialog fd(FALSE, _T("bmp"), _T("*.bmp"),OFN_HIDEREADONLY, szFilters); if(IDOK==fd.DoModal()) { CDC dc; dc.CreateCompatibleDC(NULL); CBitmap Bmp; Bmp.Attach(hBmp); BITMAP btm; Bmp.GetBitmap(&btm); BITMAPFILEHEADER bmfHeader; BITMAPINFOHEADER bi; bi.biSize = sizeof(BITMAPINFOHEADER); bi.biWidth = btm.bmWidth; bi.biHeight = btm.bmHeight; bi.biPlanes = 1; bi.biBitCount = 32; bi.biCompression = BI_RGB; bi.biSizeImage = 0; bi.biXPelsPerMeter = 0; bi.biYPelsPerMeter = 0; bi.biClrUsed = 0; bi.biClrImportant = 0; DWORD dwBmpSize =((btm.bmWidth*bi.biBitCount+31)/32) *4*btm.bmHeight; // Starting with 32-bit Windows, GlobalAlloc and LocalAlloc //are implemented as wrapper functions that // call HeapAlloc using a handle to the process's default heap. //Therefore, GlobalAlloc and LocalAlloc // have greater overhead than HeapAlloc. HANDLE hDIB = ::GlobalAlloc(GHND,dwBmpSize); LPBITMAPINFOHEADER lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB); *lpbi = bi; // Gets the "bits" from the bitmap and copies them into a buffer // which is pointed to by lpbi ::GetDIBits(dc.operator HDC(),hBmp,0, (UINT)btm.bmHeight,lpbi, (BITMAPINFO*)lpbi,DIB_RGB_COLORS); CString strName=fd.GetPathName(); CFile bf; if(bf.Open(strName,CFile::modeCreate|CFile::modeWrite)) { //Offset to where the actual bitmap bits start. bmfHeader.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+ (DWORD)sizeof(BITMAPINFOHEADER); //Size of the Data bmfHeader.bfSize=dwBmpSize; //bfType must always be BM for Bitmaps bmfHeader.bfType=0x4D42; //BM bf.Write((LPSTR)&bmfHeader,sizeof(BITMAPFILEHEADER)); bf.Write((LPSTR)&bi,sizeof(BITMAPINFOHEADER)); bf.Write((LPSTR)lpbi,dwBmpSize); } //Unlock and Free the DIB from the heap GlobalUnlock(hDIB); GlobalFree(hDIB); AfxMessageBox(_T("完成态势图保存!")); } } //功能:开始截屏 void CScreenCapture::BeginCapture() { if(m_bkBmp.m_hObject!=NULL)m_bkBmp.DeleteObject(); m_bkBmp.Attach(CopyScreenToBitmap(CRect(0,0,m_cxScreen, m_cyScreen))); CRect FullRect; FullRect.left=0; FullRect.top=0; FullRect.right=m_cxScreen; FullRect.bottom=m_cyScreen; WINDOWPLACEMENT WndPla; WndPla.flags=0; WndPla.length=sizeof(WINDOWPLACEMENT); WndPla.rcNormalPosition=FullRect; WndPla.showCmd=SW_SHOWNORMAL; SetWindowPlacement(NULL, &WndPla); // SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE); // SetForegroundWindow(); }