怎么样使用ScreenBase实现截取屏幕任意区域?

怎么样使用ScreenBase实现截取屏幕任意区域?

//========================================================================
//TITLE:
// ScreenBase实现屏幕任意区域的截取
//AUTHOR:
// norains
//DATE:
// Tuesday 16-January -2007
//Environment:
//EVC4.0 + Standard SDK
//========================================================================

1.ScreenBase 源码

ScreenBase为自己写代码方便而封装的一个API类,该类的的主要功能是截取屏幕任意区域的图像,并将之保存为BMP文件.

源代码如下:

怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?怎么样使用ScreenBase实现截取屏幕任意区域?//////////////////////////////////////////////////////////////////////
怎么样使用ScreenBase实现截取屏幕任意区域?//ScreenBase.h:interfacefortheCScreenBaseclass.
怎么样使用ScreenBase实现截取屏幕任意区域?怎么样使用ScreenBase实现截取屏幕任意区域?//////////////////////////////////////////////////////////////////////
怎么样使用ScreenBase实现截取屏幕任意区域?#ifndefSCREENBASE_H
怎么样使用ScreenBase实现截取屏幕任意区域?
#defineSCREENBASE_H
怎么样使用ScreenBase实现截取屏幕任意区域?//-------------------------------------------------------------------
怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?classCScreenBase
怎么样使用ScreenBase实现截取屏幕任意区域?怎么样使用ScreenBase实现截取屏幕任意区域?
{
怎么样使用ScreenBase实现截取屏幕任意区域?
public:
怎么样使用ScreenBase实现截取屏幕任意区域?
voidCopyScreen();
怎么样使用ScreenBase实现截取屏幕任意区域?
voidSaveFile(TCHAR*pszPath);
怎么样使用ScreenBase实现截取屏幕任意区域?CScreenBase();
怎么样使用ScreenBase实现截取屏幕任意区域?
virtual~CScreenBase();
怎么样使用ScreenBase实现截取屏幕任意区域?
voidInitialize(constRECT*prcScr=NULL);
怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?
protected:
怎么样使用ScreenBase实现截取屏幕任意区域?
voidDestroy();
怎么样使用ScreenBase实现截取屏幕任意区域?typedef
struct
怎么样使用ScreenBase实现截取屏幕任意区域?怎么样使用ScreenBase实现截取屏幕任意区域?{
怎么样使用ScreenBase实现截取屏幕任意区域?HDChDC;
//TheDCsavethescreedDC
怎么样使用ScreenBase实现截取屏幕任意区域?HGDIOBJhOldSel;//TheoldobjectofsaveDC
怎么样使用ScreenBase实现截取屏幕任意区域?HBITMAPhBmpSel;//Theselectedbitmap
怎么样使用ScreenBase实现截取屏幕任意区域?}
SAVEDCINFO,*LPSAVEDCINFO;
怎么样使用ScreenBase实现截取屏幕任意区域?SAVEDCINFOm_SaveDCInfo;
怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?typedef
struct
怎么样使用ScreenBase实现截取屏幕任意区域?怎么样使用ScreenBase实现截取屏幕任意区域?{
怎么样使用ScreenBase实现截取屏幕任意区域?BYTE
*lpBitmapBits;//Pointertoavariablethatreceivesapointertothelocationofthedevice-independentbitmap'sbitvalues
怎么样使用ScreenBase实现截取屏幕任意区域?BITMAPINFObitMapInfo;//Thesavebitmapinfo
怎么样使用ScreenBase实现截取屏幕任意区域?}
SAVEBITMAPINFO,*LPSAVEBITMAPINFO;
怎么样使用ScreenBase实现截取屏幕任意区域?SAVEBITMAPINFOm_SaveBitmapInfo;
怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?
voidSaveFile(LPSAVEBITMAPINFOlpSaveBitmapInfo,TCHAR*pszPath);
怎么样使用ScreenBase实现截取屏幕任意区域?
voidInitializeSaveDC(LPSAVEDCINFOlpSaveDCInfo,LPSAVEBITMAPINFOlpSaveBitmapInfo,constRECT*prcSave);
怎么样使用ScreenBase实现截取屏幕任意区域?
voidDestroySaveDC(LPSAVEDCINFOlpSaveDCInfo,LPSAVEBITMAPINFOlpSaveBitmapInfo);
怎么样使用ScreenBase实现截取屏幕任意区域?
voidCopyScreenDC(HDC*pHdcDest,constLPSAVEBITMAPINFOlpSaveBitmapInfo,constRECT*prcSrc);
怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?RECTm_rcSave;
//Theareaforsaving
怎么样使用ScreenBase实现截取屏幕任意区域?HDCm_hScrDC;//ThehandleDCofscreen
怎么样使用ScreenBase实现截取屏幕任意区域?}
;
怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?
//--------------------------------------------------------------------------
怎么样使用ScreenBase实现截取屏幕任意区域?#endif//!definedSCREENBASE_H
怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?怎么样使用ScreenBase实现截取屏幕任意区域?//////////////////////////////////////////////////////////////////////
怎么样使用ScreenBase实现截取屏幕任意区域?//ScreenBase.cpp:implementationoftheCScreenBaseclass.
怎么样使用ScreenBase实现截取屏幕任意区域?怎么样使用ScreenBase实现截取屏幕任意区域?//////////////////////////////////////////////////////////////////////
怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?#include"stdafx.h"
怎么样使用ScreenBase实现截取屏幕任意区域?#include"ScreenBase.h"
怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?怎么样使用ScreenBase实现截取屏幕任意区域?
//////////////////////////////////////////////////////////////////////
怎么样使用ScreenBase实现截取屏幕任意区域?//Construction/Destruction
怎么样使用ScreenBase实现截取屏幕任意区域?怎么样使用ScreenBase实现截取屏幕任意区域?//////////////////////////////////////////////////////////////////////
怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?CScreenBase::CScreenBase()
怎么样使用ScreenBase实现截取屏幕任意区域?怎么样使用ScreenBase实现截取屏幕任意区域?
{
怎么样使用ScreenBase实现截取屏幕任意区域?memset(
&m_rcSave,0,sizeof(m_rcSave));
怎么样使用ScreenBase实现截取屏幕任意区域?m_hScrDC
=NULL;
怎么样使用ScreenBase实现截取屏幕任意区域?}

怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?CScreenBase::
~CScreenBase()
怎么样使用ScreenBase实现截取屏幕任意区域?怎么样使用ScreenBase实现截取屏幕任意区域?
{
怎么样使用ScreenBase实现截取屏幕任意区域?Destroy();
怎么样使用ScreenBase实现截取屏幕任意区域?}

怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?
//----------------------------------------------------------------------
怎么样使用ScreenBase实现截取屏幕任意区域?
//Description:
怎么样使用ScreenBase实现截取屏幕任意区域?
//DestroythesaveDC
怎么样使用ScreenBase实现截取屏幕任意区域?
//--------------------------------------------------------------------
怎么样使用ScreenBase实现截取屏幕任意区域?voidCScreenBase::DestroySaveDC(LPSAVEDCINFOlpSaveDCInfo,LPSAVEBITMAPINFOlpSaveBitmapInfo)
怎么样使用ScreenBase实现截取屏幕任意区域?怎么样使用ScreenBase实现截取屏幕任意区域?
{
怎么样使用ScreenBase实现截取屏幕任意区域?
if(lpSaveDCInfo->hDC!=NULL&&lpSaveDCInfo->hOldSel!=NULL)
怎么样使用ScreenBase实现截取屏幕任意区域?怎么样使用ScreenBase实现截取屏幕任意区域?
{
怎么样使用ScreenBase实现截取屏幕任意区域?SelectObject(lpSaveDCInfo
->hDC,lpSaveDCInfo->hOldSel);
怎么样使用ScreenBase实现截取屏幕任意区域?}

怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?
if(lpSaveDCInfo->hDC!=NULL)
怎么样使用ScreenBase实现截取屏幕任意区域?怎么样使用ScreenBase实现截取屏幕任意区域?
{
怎么样使用ScreenBase实现截取屏幕任意区域?DeleteDC(lpSaveDCInfo
->hDC);
怎么样使用ScreenBase实现截取屏幕任意区域?}

怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?
if(lpSaveDCInfo->hBmpSel!=NULL)
怎么样使用ScreenBase实现截取屏幕任意区域?怎么样使用ScreenBase实现截取屏幕任意区域?
{
怎么样使用ScreenBase实现截取屏幕任意区域?DeleteObject(lpSaveDCInfo
->hBmpSel);
怎么样使用ScreenBase实现截取屏幕任意区域?}

怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?memset(lpSaveDCInfo,
0,sizeof(SAVEDCINFO));
怎么样使用ScreenBase实现截取屏幕任意区域?memset(lpSaveBitmapInfo,
0,sizeof(SAVEBITMAPINFO));
怎么样使用ScreenBase实现截取屏幕任意区域?}

怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?
//----------------------------------------------------------------------
怎么样使用ScreenBase实现截取屏幕任意区域?
//Description:
怎么样使用ScreenBase实现截取屏幕任意区域?
//InitializethesaveDC
怎么样使用ScreenBase实现截取屏幕任意区域?
//--------------------------------------------------------------------
怎么样使用ScreenBase实现截取屏幕任意区域?voidCScreenBase::InitializeSaveDC(LPSAVEDCINFOlpSaveDCInfo,LPSAVEBITMAPINFOlpSaveBitmapInfo,constRECT*prcSave)
怎么样使用ScreenBase实现截取屏幕任意区域?怎么样使用ScreenBase实现截取屏幕任意区域?
{
怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?
//thepointerwillsaveallpixelpoint'scolorvalue
怎么样使用ScreenBase实现截取屏幕任意区域?lpSaveBitmapInfo->lpBitmapBits=NULL;
怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?
//createsamemorydevicecontext(DC)compatiblewiththescreendevice(hScrDC)
怎么样使用ScreenBase实现截取屏幕任意区域?lpSaveDCInfo->hDC=CreateCompatibleDC(m_hScrDC);
怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?
//InitialisethestructBITMAPINFOforthebimapinfomation,
怎么样使用ScreenBase实现截取屏幕任意区域?
//inordertousethefunctionCreateDIBSectiononwinceos,
怎么样使用ScreenBase实现截取屏幕任意区域?
//eachpixelstoredby24bits(biBitCount=24)andnocompressing(biCompression=0)
怎么样使用ScreenBase实现截取屏幕任意区域?ZeroMemory(&m_SaveBitmapInfo.bitMapInfo,sizeof(BITMAPINFO));
怎么样使用ScreenBase实现截取屏幕任意区域?lpSaveBitmapInfo
->bitMapInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
怎么样使用ScreenBase实现截取屏幕任意区域?lpSaveBitmapInfo
->bitMapInfo.bmiHeader.biWidth=prcSave->right-prcSave->left;
怎么样使用ScreenBase实现截取屏幕任意区域?lpSaveBitmapInfo
->bitMapInfo.bmiHeader.biHeight=prcSave->bottom-prcSave->top;
怎么样使用ScreenBase实现截取屏幕任意区域?lpSaveBitmapInfo
->bitMapInfo.bmiHeader.biPlanes=1;
怎么样使用ScreenBase实现截取屏幕任意区域?lpSaveBitmapInfo
->bitMapInfo.bmiHeader.biBitCount=24;
怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?
//usethefunctionCreateDIBSectionandSelectObjectinordertogetthebimappointer:lpBitmapBits
怎么样使用ScreenBase实现截取屏幕任意区域?lpSaveDCInfo->hBmpSel=CreateDIBSection(lpSaveDCInfo->hDC,
怎么样使用ScreenBase实现截取屏幕任意区域?
&lpSaveBitmapInfo->bitMapInfo,
怎么样使用ScreenBase实现截取屏幕任意区域?DIB_RGB_COLORS,
怎么样使用ScreenBase实现截取屏幕任意区域?(
void**)&lpSaveBitmapInfo->lpBitmapBits,
怎么样使用ScreenBase实现截取屏幕任意区域?NULL,
怎么样使用ScreenBase实现截取屏幕任意区域?
0);
怎么样使用ScreenBase实现截取屏幕任意区域?lpSaveDCInfo
->hOldSel=SelectObject(lpSaveDCInfo->hDC,lpSaveDCInfo->hBmpSel);
怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?}

怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?
//----------------------------------------------------------------------
怎么样使用ScreenBase实现截取屏幕任意区域?
//Description:
怎么样使用ScreenBase实现截取屏幕任意区域?
//Savethebitmapofsavedctothefile
怎么样使用ScreenBase实现截取屏幕任意区域?
//--------------------------------------------------------------------
怎么样使用ScreenBase实现截取屏幕任意区域?voidCScreenBase::SaveFile(LPSAVEBITMAPINFOlpSaveBitmapInfo,TCHAR*pszPath)
怎么样使用ScreenBase实现截取屏幕任意区域?怎么样使用ScreenBase实现截取屏幕任意区域?
{
怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?
intiWidth=lpSaveBitmapInfo->bitMapInfo.bmiHeader.biWidth;
怎么样使用ScreenBase实现截取屏幕任意区域?
intiHeight=lpSaveBitmapInfo->bitMapInfo.bmiHeader.biHeight;
怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?
//Ifyouonlywanttogettheeverypixelcolorvalue,
怎么样使用ScreenBase实现截取屏幕任意区域?
//youcanbeginhereandthefollowingpartofthisfunctionwillbeunuseful;
怎么样使用ScreenBase实现截取屏幕任意区域?
//thefollowingpartisinordertowritefile;
怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?
//Bimapfileheaderinordertowritebmpfile
怎么样使用ScreenBase实现截取屏幕任意区域?BITMAPFILEHEADERbmBITMAPFILEHEADER;
怎么样使用ScreenBase实现截取屏幕任意区域?ZeroMemory(
&bmBITMAPFILEHEADER,sizeof(BITMAPFILEHEADER));
怎么样使用ScreenBase实现截取屏幕任意区域?bmBITMAPFILEHEADER.bfType
=0x4d42;//bmp
怎么样使用ScreenBase实现截取屏幕任意区域?bmBITMAPFILEHEADER.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
怎么样使用ScreenBase实现截取屏幕任意区域?怎么样使用ScreenBase实现截取屏幕任意区域?bmBITMAPFILEHEADER.bfSize
=bmBITMAPFILEHEADER.bfOffBits+((iWidth*iHeight)*3);///norains:3=(24/8)
怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?//writeintofile
怎么样使用ScreenBase实现截取屏幕任意区域?FILE*mStream=NULL;
怎么样使用ScreenBase实现截取屏幕任意区域?
if((mStream=_tfopen(pszPath,TEXT("wb"))))
怎么样使用ScreenBase实现截取屏幕任意区域?怎么样使用ScreenBase实现截取屏幕任意区域?
{
怎么样使用ScreenBase实现截取屏幕任意区域?
//writebitmapfileheader
怎么样使用ScreenBase实现截取屏幕任意区域?fwrite(&bmBITMAPFILEHEADER,sizeof(BITMAPFILEHEADER),1,mStream);
怎么样使用ScreenBase实现截取屏幕任意区域?
//writebitmapinfo
怎么样使用ScreenBase实现截取屏幕任意区域?fwrite(&(lpSaveBitmapInfo->bitMapInfo.bmiHeader),sizeof(BITMAPINFOHEADER),1,mStream);
怎么样使用ScreenBase实现截取屏幕任意区域?
//writebitmappixelsdata
怎么样使用ScreenBase实现截取屏幕任意区域?fwrite(lpSaveBitmapInfo->lpBitmapBits,3*iWidth*iHeight,1,mStream);
怎么样使用ScreenBase实现截取屏幕任意区域?
//closefile
怎么样使用ScreenBase实现截取屏幕任意区域?fclose(mStream);
怎么样使用ScreenBase实现截取屏幕任意区域?}

怎么样使用ScreenBase实现截取屏幕任意区域?}

怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?
//----------------------------------------------------------------------
怎么样使用ScreenBase实现截取屏幕任意区域?
//Description:
怎么样使用ScreenBase实现截取屏幕任意区域?
//CopythescreenDCtothedestDC
怎么样使用ScreenBase实现截取屏幕任意区域?
//--------------------------------------------------------------------
怎么样使用ScreenBase实现截取屏幕任意区域?voidCScreenBase::CopyScreenDC(HDC*pHdcDest,constLPSAVEBITMAPINFOlpSaveBitmapInfo,constRECT*prcSrc)
怎么样使用ScreenBase实现截取屏幕任意区域?怎么样使用ScreenBase实现截取屏幕任意区域?
{
怎么样使用ScreenBase实现截取屏幕任意区域?
//copythescreendctothememorydc
怎么样使用ScreenBase实现截取屏幕任意区域?BitBlt(*pHdcDest,0,0,lpSaveBitmapInfo->bitMapInfo.bmiHeader.biWidth,lpSaveBitmapInfo->bitMapInfo.bmiHeader.biHeight,m_hScrDC,prcSrc->left,prcSrc->top,SRCCOPY);
怎么样使用ScreenBase实现截取屏幕任意区域?}

怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?
怎么样使用ScreenBase实现截取屏幕任意区域?
//----------------------------------------------------------------------
怎么样使用ScreenBase实现截取屏幕任意区域?
//Description:
怎么样使用ScreenBase实现截取屏幕任意区域?
//Initializetheinstance
怎么样使用ScreenBase实现截取屏幕任意区域?
//--------------------------------------------------------------------
怎么样使用ScreenBase实现截取屏幕任意区域?voidCScreenBase::Initialize(const