/**/// // ScreenBase.h: interface for the CScreenBase class. /**/// #ifndef SCREENBASE_H #define SCREENBASE_H //------------------------------------------------------------------- class CScreenBase ...{ public: void CopyScreen(); void SaveFile(TCHAR *pszPath); CScreenBase(); virtual~CScreenBase(); void Initialize(const RECT *prcScr = NULL); protected: void Destroy(); typedef struct ...{ HDC hDC; //The DC save the screed DC HGDIOBJ hOldSel; //The old object of save DC HBITMAP hBmpSel; //The selected bitmap }SAVEDCINFO,*LPSAVEDCINFO; SAVEDCINFO m_SaveDCInfo; typedef struct ...{ BYTE *lpBitmapBits; //Pointer to a variable that receives a pointer to the location of the device-independent bitmap's bit values BITMAPINFO bitMapInfo; //The savebitmap info }SAVEBITMAPINFO,*LPSAVEBITMAPINFO; SAVEBITMAPINFO m_SaveBitmapInfo; void SaveFile(LPSAVEBITMAPINFO lpSaveBitmapInfo,TCHAR *pszPath); void InitializeSaveDC(LPSAVEDCINFO lpSaveDCInfo,LPSAVEBITMAPINFO lpSaveBitmapInfo,const RECT *prcSave); void DestroySaveDC(LPSAVEDCINFO lpSaveDCInfo,LPSAVEBITMAPINFO lpSaveBitmapInfo); void CopyScreenDC(HDC *pHdcDest,const LPSAVEBITMAPINFO lpSaveBitmapInfo,const RECT *prcSrc); RECT m_rcSave; //The area for saving HDC m_hScrDC; //The handle DC of screen }; //-------------------------------------------------------------------------- #endif// !defined SCREENBASE_H
/**/// // ScreenBase.cpp: implementation of the CScreenBase class. /**/// #include "stdafx.h" #include "ScreenBase.h" /**/// // Construction/Destruction /**/// CScreenBase::CScreenBase() ...{ memset(&m_rcSave,0,sizeof(m_rcSave)); m_hScrDC = NULL; } CScreenBase::~CScreenBase() ...{ Destroy(); } //---------------------------------------------------------------------- //Description: // Destroy the save DC //-------------------------------------------------------------------- void CScreenBase::DestroySaveDC(LPSAVEDCINFO lpSaveDCInfo, LPSAVEBITMAPINFO lpSaveBitmapInfo) ...{ if(lpSaveDCInfo->hDC != NULL && lpSaveDCInfo->hOldSel != NULL) ...{ SelectObject(lpSaveDCInfo->hDC, lpSaveDCInfo->hOldSel); } if(lpSaveDCInfo->hDC != NULL) ...{ DeleteDC(lpSaveDCInfo->hDC); } if(lpSaveDCInfo->hBmpSel != NULL) ...{ DeleteObject(lpSaveDCInfo->hBmpSel); } memset(lpSaveDCInfo,0,sizeof(SAVEDCINFO)); memset(lpSaveBitmapInfo,0,sizeof(SAVEBITMAPINFO)); } //---------------------------------------------------------------------- //Description: // Initialize the save DC //-------------------------------------------------------------------- void CScreenBase::InitializeSaveDC(LPSAVEDCINFO lpSaveDCInfo, LPSAVEBITMAPINFO lpSaveBitmapInfo,const RECT *prcSave) ...{ //the pointer will save all pixel point's color value lpSaveBitmapInfo->lpBitmapBits = NULL; //creates a memory device context (DC) compatible with the screen device(hScrDC) lpSaveDCInfo->hDC = CreateCompatibleDC(m_hScrDC); //Initialise the struct BITMAPINFO for the bimap infomation, //in order to use the function CreateDIBSection on wince os, //each pixel stored by 24 bits(biBitCount=24) and no compressing(biCompression=0) ZeroMemory(&m_SaveBitmapInfo.bitMapInfo, sizeof(BITMAPINFO)); lpSaveBitmapInfo->bitMapInfo.bmiHeader.biSize =sizeof(BITMAPINFOHEADER); lpSaveBitmapInfo->bitMapInfo.bmiHeader.biWidth = prcSave->right - prcSave->left; lpSaveBitmapInfo->bitMapInfo.bmiHeader.biHeight = prcSave->bottom - prcSave->top; lpSaveBitmapInfo->bitMapInfo.bmiHeader.biPlanes =1; lpSaveBitmapInfo->bitMapInfo.bmiHeader.biBitCount =24; //use the function CreateDIBSection and SelectObject in order to get the bimap pointer : lpBitmapBits lpSaveDCInfo->hBmpSel = CreateDIBSection(lpSaveDCInfo->hDC, &lpSaveBitmapInfo->bitMapInfo, DIB_RGB_COLORS, (void**)&lpSaveBitmapInfo->lpBitmapBits, NULL, 0); lpSaveDCInfo->hOldSel = SelectObject(lpSaveDCInfo->hDC, lpSaveDCInfo->hBmpSel); } //---------------------------------------------------------------------- //Description: // Save the bitmap of save dc to the file //-------------------------------------------------------------------- void CScreenBase::SaveFile(LPSAVEBITMAPINFO lpSaveBitmapInfo, TCHAR *pszPath) ...{ int iWidth = lpSaveBitmapInfo->bitMapInfo.bmiHeader.biWidth; int iHeight = lpSaveBitmapInfo->bitMapInfo.bmiHeader.biHeight; //If you only want to get the every pixel color value, //you can begin here and the following part of this function will be unuseful; //the following part is in order to write file; //Bimap file header in order to write bmp file BITMAPFILEHEADER bmBITMAPFILEHEADER; ZeroMemory(&bmBITMAPFILEHEADER, sizeof(BITMAPFILEHEADER)); bmBITMAPFILEHEADER.bfType =0x4d42; //bmp bmBITMAPFILEHEADER.bfOffBits =sizeof(BITMAPFILEHEADER) +sizeof(BITMAPINFOHEADER); bmBITMAPFILEHEADER.bfSize = bmBITMAPFILEHEADER.bfOffBits + ((iWidth * iHeight) *3); /**////norains:3=(24 / 8) //write into file FILE *mStream = NULL; if((mStream = _tfopen(pszPath, TEXT("wb")))) ...{ //write bitmap file header fwrite(&bmBITMAPFILEHEADER, sizeof(BITMAPFILEHEADER), 1, mStream); //write bitmap info fwrite(&(lpSaveBitmapInfo->bitMapInfo.bmiHeader), sizeof(BITMAPINFOHEADER), 1, mStream); //write bitmap pixels data fwrite(lpSaveBitmapInfo->lpBitmapBits, 3*iWidth*iHeight, 1, mStream); //close file fclose(mStream); } } //---------------------------------------------------------------------- //Description: // Copy the screen DC to the dest DC //-------------------------------------------------------------------- void CScreenBase::CopyScreenDC(HDC *pHdcDest,const LPSAVEBITMAPINFO lpSaveBitmapInfo,const RECT *prcSrc) ...{ // copy the screen dc to the memory dc BitBlt(*pHdcDest, 0, 0, lpSaveBitmapInfo->bitMapInfo.bmiHeader.biWidth, lpSaveBitmapInfo->bitMapInfo.bmiHeader.biHeight, m_hScrDC, prcSrc->left, prcSrc->top, SRCCOPY); } //---------------------------------------------------------------------- //Description: // Initialize the instance //-------------------------------------------------------------------- void CScreenBase::Initialize(const RECT *prcScr) ...{ Destroy(); //creates a device context for the screen device m_hScrDC = CreateDC(_T("DISPLAY"), NULL, NULL, NULL); if(prcScr != NULL) ...{ m_rcSave =*prcScr; } else ...{ //Get the full window int iWidth = GetDeviceCaps(m_hScrDC, HORZRES); int iHeight = GetDeviceCaps(m_hScrDC, VERTRES); m_rcSave.left =0; m_rcSave.top =0; m_rcSave.bottom = iHeight; m_rcSave.right = iWidth; } InitializeSaveDC(&m_SaveDCInfo,&m_SaveBitmapInfo,&m_rcSave); } //---------------------------------------------------------------------- //Description: // Destroy all the resource //-------------------------------------------------------------------- void CScreenBase::Destroy() ...{ if(m_hScrDC != NULL) ...{ DeleteDC(m_hScrDC); m_hScrDC = NULL; } DestroySaveDC(&m_SaveDCInfo,&m_SaveBitmapInfo); } //---------------------------------------------------------------------- //Description: // Save the bitmap of screen to the file //-------------------------------------------------------------------- void CScreenBase::SaveFile(TCHAR *pszPath) ...{ SaveFile(&m_SaveBitmapInfo,pszPath); } //---------------------------------------------------------------------- //Description: // Copy the screen to the save DC //-------------------------------------------------------------------- void CScreenBase::CopyScreen() ...{ CopyScreenDC(&m_SaveDCInfo.hDC,&m_SaveBitmapInfo,&m_rcSave); }