屏幕截图

来源:互联网 发布: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);

原创粉丝点击