// 截取屏幕图片
CDC dc ;
dc .CreateDC ("DISPLAY",NULL ,NULL ,NULL ); // 创建设备描述表
CBitmap bm ;
int Width = GetSystemMetrics (SM_CXSCREEN );// 得到屏幕的宽
int Height = GetSystemMetrics (SM_CYSCREEN );// 得到屏幕的高
bm .CreateCompatibleBitmap (&dc ,Width ,Height );// 创建与屏幕设备描述表兼容位图
CDC tdc ;
// 与设备描述表兼容的内存设备描述表
tdc .CreateCompatibleDC (&dc );
CBitmap *pOld = tdc .SelectObject (&bm );
// 设备描述表拷贝到内存设备描述表中
tdc .BitBlt (0,0,Width ,Height ,&dc ,0,0,SRCCOPY );
tdc .SelectObject (pOld );
bm .GetBitmap (&btm );
// 压缩转化成jpg 格式
HBITMAP m_hBmp = (HBITMAP )bm .GetSafeHandle ();
CImage m_image ;
m_image .Attach (m_hBmp ); // 绑定到m_hBmp
IStream * pStmImage = NULL ;
HGLOBAL hMemBmp = GlobalAlloc (GMEM_MOVEABLE ,0);// 分配一块默认堆,返回一块内存对象句柄
if (hMemBmp == NULL )
return ;
CreateStreamOnHGlobal (hMemBmp , FALSE , &pStmImage ); // 将内存区作为流的起始
if (pStmImage == NULL )
{
GlobalFree (hMemBmp );
AfxMessageBox ( " 为空 ");
return ;
}
m_image .Save (pStmImage ,Gdiplus ::ImageFormatJPEG );// 以jpg格式保存
BYTE * pbyBmp = (BYTE *)GlobalLock (hMemBmp );// 把一个内存对象句柄转化成一个指针
int msize = GlobalSize (hMemBmp );
BYTE * bdata = new BYTE [msize ]; // 申请数据空间
memcpy (bdata ,pbyBmp ,msize ); // 得到文件的数据
// 这时就可以把bdata中的数据保存到文件中了
// 释放空间
if ( bdata != NULL )
{
delete []bdata ;
bdata = NULL ;
}
// 释放流
if (pStmImage != NULL )
{
pStmImage -> Release ();
pStmImage = NULL ;
}
// 释放堆空间
if (hMemBmp != NULL )
{
GlobalUnlock (hMemBmp );
GlobalFree (hMemBmp );
hMemBmp = NULL ;
}
if (m_image )
{
m_image .Detach ();
m_image .Destroy ();
}
::DeleteObject (m_hBmp );