截屏实现代码

///////////////////////////////////////////////////////
//   CaptureControl.h
//   freefalcon   2004.12.10  

#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__
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值