屏幕截图
来源:互联网 发布:python神经网络 教程 编辑:程序博客网 时间:2024/06/03 02:31
头文件:#include <windowsx.h>
变量:UINT nCount;
CString m_Path;
CString m_Number;
初始化:m_Path = _T("c:");
m_Number = _T("0 picture captured.");
nCount=0;
CDC dc;
//获取整个屏幕的dc(设备场景)
dc.CreateDC("DISPLAY",NULL,NULL,NULL);
CBitmap bm;
//获得以像素为单位的显示高度,宽度,从而得到屏幕分辨率
int Width=GetSystemMetrics(SM_CXSCREEN);
int Height=GetSystemMetrics(SM_CYSCREEN);
//创建一个与屏幕dc兼容的位图
bm.CreateCompatibleBitmap(&dc,Width,Height);
CDC tdc;
//为屏幕dc创建兼容的内存tdc
tdc.CreateCompatibleDC(&dc);
//把新位图选到内存dc中,并保存原位图
CBitmap*pOld=tdc.SelectObject(&bm);
//将屏幕图像从屏幕dc拷到内存dc,其实拷到到bitmap中
tdc.BitBlt(0,0,Width,Height,&dc,0,0,SRCCOPY);
//恢复内存dc中的原位图
tdc.SelectObject(pOld);
// //屏幕已拷到兼容位图bitmap上,下面将它保存到剪贴板
// if((::OpenClipboard(NULL) != 0) && (::EmptyClipboard() != 0))
// {
// ::SetClipboardData(CF_BITMAP,bitmap.GetSafeHandle());
// ::CloseClipboard();
// }
//下面将内存中的位图保存为位图文件
BITMAP btm;
bm.GetBitmap(&btm);
DWORD size=btm.bmWidthBytes*btm.bmHeight;
/*接下来要使用GlobalAlloc()函数从堆中分配指定大小的内存,并返回指向这块内存的指针,分配内存是将内存的内容初始化为全零。*/
/*为了保护我们分配的这块内存,我们要调用GlobalLock来锁定这块内存,避免被其他的进程占用,这个函数返回指向内存锁的第一个指针*/
LPSTR lpData=(LPSTR)GlobalAllocPtr(GPTR,size);
/*定义位图头,并对这个结构体变量初始化,这个结构之后初始化之后才能使用,尤其要指定位图的大小和位图的高度宽度*/
BITMAPINFOHEADER bih;
bih.biBitCount=btm.bmBitsPixel;
bih.biClrImportant=0;
bih.biClrUsed=0;
bih.biCompression=0;
bih.biHeight=btm.bmHeight;
bih.biPlanes=1;
bih.biSize=sizeof(BITMAPINFOHEADER);
bih.biSizeImage=size;
bih.biWidth=btm.bmWidth;
bih.biXPelsPerMeter=0;
bih.biYPelsPerMeter=0;
/*将位图中的数据以bits的形式放入lpData指向的位图数组中,这里用到了GetDIBits()函数。*/
GetDIBits(dc,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
static int filecount=0;
CString name;
name.Format("pict%04d.bmp",filecount++);
name=m_Path+name;
/*位图文件和普通的文件使用起来有区别,为了保存位图,我们这里定义了一个位图文件,用它来专门保存位图文件,在使用之前,也要填充位图文件的头部信息。Bfh的bfType成员没有选择,必须赋值为BM,bfReserved1和bfReserved2都必须指定为0。bfSize指定*/
BITMAPFILEHEADER bfh;
bfh.bfReserved1=bfh.bfReserved2=0;
bfh.bfType=((WORD)('M'<< 8)|'B');
bfh.bfSize=54+size;
bfh.bfOffBits=54;
CFile bf;
/*对于位图文件的写入,我们可以使用下面的方法*/
if(bf.Open(name,CFile::modeCreate|CFile::modeWrite)){
bf.WriteHuge(&bfh,sizeof(BITMAPFILEHEADER));
bf.WriteHuge(&bih,sizeof(BITMAPINFOHEADER));
bf.WriteHuge(lpData,size);
bf.Close();
nCount++;
}
/*释放掉从堆中分配的内存,避免内存泄露*/
GlobalFreePtr(lpData);
if(nCount==1)
m_Number.Format("%d picture captured.",nCount);
else
m_Number.Format("%d pictures captured.",nCount);
UpdateData(FALSE);
- 屏幕截图
- 屏幕截图
- 屏幕截图
- 屏幕截图
- 屏幕截图
- 屏幕截图
- 屏幕截图
- 屏幕截图
- 屏幕截图
- 屏幕截图
- 屏幕截图
- 屏幕截图
- 屏幕截图
- 屏幕截图
- 屏幕截图
- 屏幕截图
- 屏幕截图
- 屏幕截图
- 用Visual C++设计屏幕抓图程序
- JDBC中针对数据的批量操作
- [观点]给年轻程序员的几句话
- Float型和Double混用的结果
- 字符设备之笔记-Poll机制分析
- 屏幕截图
- linux设备驱动之led子系统<二>
- SQL 按字段取最大值
- JDBC(二)
- php socket
- 用MFC实现OpenGL编程
- Oracle DUL/AUL/ODU 工具说明
- DirectX中的多重纹理相关技术
- 20110914工作总结