/////////////////////////////////////////////////////// // CaptureControl.h // freefalcon 2004.12.10 #include <afxwin.h> #ifndef __CAPTURE_CONTROL_H__ #define __CAPTURE_CONTROL_H__
#define CAPTURE_DEST_CLIPBOARD 0 #define CAPTURE_DEST_FILE 1
class CCaptureControl { public: CCaptureControl() { m_hWnd = NULL; m_nDest = CAPTURE_DEST_CLIPBOARD; m_strFilePath = "."; m_strFileName = "NoName"; m_nWidth = 0; m_nHeight = 0; }
virtual ~CCaptureControl() { } HWND SetWindow(HWND hWnd = NULL) { HWND oldhWnd = m_hWnd; m_hWnd = hWnd; return oldhWnd; } void SetDestination(UINT nDest) { m_nDest = nDest; }
void SetFilePath(const CString& strFilePath) { m_strFilePath = strFilePath; }
void SetFileName(const CString& strFileName) { m_strFileName = strFileName; } int GetWidth() const { return m_nWidth; } int GetHeight() const { return m_nHeight; } BOOL Capture() { BOOL ret = TRUE; CDC dc; int nWidth; int nHeight; if(m_hWnd == NULL) { dc.CreateDC("DISPLAY",NULL,NULL,NULL); nWidth = GetSystemMetrics(SM_CXSCREEN); nHeight = GetSystemMetrics(SM_CYSCREEN); } else { CWnd* pWnd = CWnd::FromHandle(m_hWnd); CDC* pDC = pWnd->GetDC(); dc.Attach(pDC->GetSafeHdc()); CRect rect; pWnd->GetClientRect(&rect); nWidth = rect.Width(); nHeight = rect.Height(); } m_nWidth = nWidth; m_nHeight = nHeight; CDC dcMem; dcMem.CreateCompatibleDC(&dc); CBitmap bitmap; bitmap.CreateCompatibleBitmap(&dc, nWidth, nHeight); CBitmap *pOldBitmap = dcMem.SelectObject(&bitmap); dcMem.BitBlt(0,0,nWidth,nHeight,&dc,0,0,SRCCOPY); dcMem.SelectObject(pOldBitmap); if(m_nDest == CAPTURE_DEST_CLIPBOARD) { ret = CopyBitmapToClipboard(bitmap); } else if(m_nDest == CAPTURE_DEST_FILE) { CString strFileFullPath = m_strFilePath+"\\"+m_strFileName + ".bmp"; ret = SaveBitmapToFile(dc.GetSafeHdc(), bitmap, strFileFullPath); } if(m_hWnd == NULL) { dc.DeleteDC(); } else { dc.Detach(); }
return ret; }
protected: BOOL CopyBitmapToClipboard(const CBitmap& bitmap) { BOOL ret = FALSE; if((::OpenClipboard(NULL) != 0) && (::EmptyClipboard() != 0)) { if(::SetClipboardData(CF_BITMAP,bitmap.GetSafeHandle()) != NULL) { ret = TRUE; } ::CloseClipboard(); }
return ret; }
BOOL SaveBitmapToFile(HDC hDC, CBitmap& bitmap, LPCTSTR lpszFileName) { BOOL ret = TRUE; BITMAP btm; bitmap.GetBitmap(&btm); DWORD size = btm.bmWidthBytes * btm.bmHeight;
HGLOBAL hMem = GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT,size); if(hMem == NULL) { return FALSE; } LPSTR lpData = (LPSTR)GlobalLock(hMem);
///////////////////////////////////////////// BITMAPINFOHEADER bih; bih.biSize = sizeof(BITMAPINFOHEADER); bih.biWidth = btm.bmWidth; bih.biHeight = btm.bmHeight; bih.biPlanes = 1; bih.biBitCount = btm.bmBitsPixel; bih.biCompression = 0; bih.biSizeImage = size; bih.biXPelsPerMeter = 0; bih.biYPelsPerMeter = 0; bih.biClrUsed = 0; bih.biClrImportant = 0; if(GetDIBits(hDC,bitmap,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS) == 0) { GlobalFree(hMem); return FALSE; } //bitmap.GetBitmapBits(size,lpData);//此函数在处理5-5-5模式的16位色下会出现颜色混乱 BITMAPFILEHEADER bfh; bfh.bfType = ((WORD)('M'<< 8)|'B'); bfh.bfReserved1 = 0; bfh.bfReserved2 = 0; bfh.bfSize = 54+size; bfh.bfOffBits = 54; CFile bf; if(bf.Open(lpszFileName, CFile::modeCreate|CFile::modeWrite)) { bf.WriteHuge(&bfh,sizeof(BITMAPFILEHEADER)); bf.WriteHuge(&bih,sizeof(BITMAPINFOHEADER)); bf.WriteHuge(lpData,size); bf.Close(); } else { ret = FALSE; } GlobalFree(hMem);
return ret; }
protected: UINT m_nDest; HWND m_hWnd; CString m_strFilePath; CString m_strFileName; int m_nWidth; int m_nHeight; };
#endif//__CAPTURE_CONTROL_H__ int main() { CBitmap const bitmap; CString const path="C:\\"; CString const fileName="ok.bmp"; CCaptureControl c; c.SetFilePath(path); c.SetFileName(fileName); c.SetDestination(1); c.Capture(); c.~CCaptureControl(); return 0; }
说明:该类由csdn朋友freefalcon(心宇—小小菜鸟想高飞) 设计,我只是收藏 
|