截图

来源:互联网 发布:零基础怎么学python 编辑:程序博客网 时间:2024/04/27 07:57

//此函数为截图函数:
bool myGetScreenAndSave(CRect rc, CString lpFileName)
{
 HWND hwnd = ::GetDesktopWindow();
 HDC hsrc = ::GetDC(hwnd);
 HDC hmemdc = ::CreateCompatibleDC(hsrc);
 rc.NormalizeRect();
 SIZE sz;
 sz.cx=rc.right-rc.left;
 sz.cy=rc.bottom-rc.top;
 HBITMAP hbmp = ::CreateCompatibleBitmap(hsrc,sz.cx,sz.cy);
 HGDIOBJ holdbmp = ::SelectObject(hmemdc,hbmp);
 ::BitBlt(hmemdc,0,0,sz.cx,sz.cx,hsrc,rc.left,rc.top,SRCCOPY);
 ::SelectObject(hmemdc,holdbmp);
 ::DeleteObject(hmemdc);
 ::ReleaseDC(hwnd,hsrc);

 HDC hDC;
 //设备描述表 
  int iBits;
 //当前显示分辨率下每个像素所占字节数
 WORD            wBitCount;
 //位图中每个像素所占字节数
 DWORD           dwPaletteSize=0,
 //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
 dwBmBitsSize,
 dwDIBSize, dwWritten;
 BITMAP          Bitmap;       
 BITMAPFILEHEADER   bmfHdr;
 //位图属性结构   
 BITMAPINFOHEADER   bi;
  //位图文件头结构      
 LPBITMAPINFOHEADER lpbi;
 //位图信息头结构    
 HANDLE          fh, hDib, hPal,hOldPal=NULL;
 //指向位图信息头结构,定义文件,分配内存句柄,调色板句柄
 //计算位图文件每个像素所占字节数
 hDC = CreateDC(_T("DISPLAY"),NULL,NULL,NULL);
 iBits = GetDeviceCaps(hDC, BITSPIXEL) *
 GetDeviceCaps(hDC, PLANES);
 DeleteDC(hDC);
 if (iBits <= 1)
 wBitCount = 1;
 else
 if (iBits <= 4)
 wBitCount = 4;
 else
 if (iBits <= 8)
 wBitCount = 8;
 else
 {
 if (iBits <= 24)
 wBitCount = 24;
 else
 wBitCount = 32;//原来没有,应有
 }

  
   //计算调色板大小
   if (wBitCount <= 8)
   dwPaletteSize = (1 << wBitCount) *sizeof(RGBQUAD);
  
   //设置位图信息头结构
   GetObject(hbmp, sizeof(BITMAP), (LPSTR)&Bitmap);
   bi.biSize            = sizeof(BITMAPINFOHEADER);
   bi.biWidth           = Bitmap.bmWidth;
   bi.biHeight          = Bitmap.bmHeight;
   bi.biPlanes          = 1;
   bi.biBitCount         = wBitCount;
   bi.biCompression      = BI_RGB;
   bi.biSizeImage        = 0;
   bi.biXPelsPerMeter     = 0;
   bi.biYPelsPerMeter     = 0;
   bi.biClrUsed         = 0;
   bi.biClrImportant      = 0;
  
   dwBmBitsSize = ((Bitmap.bmWidth*wBitCount+31)/32)*4*Bitmap.bmHeight;
  
  
   //为位图内容分配内存
   hDib  = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));
  
   if(hDib==NULL)
   AfxMessageBox(_T("null"));
   lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
   *lpbi = bi;
  
   // 处理调色板  
   hPal = GetStockObject(DEFAULT_PALETTE);
   if (hPal)
   {
   hDC  = ::GetDC(NULL);
   hOldPal = SelectPalette(hDC, (HPALETTE)hPal, FALSE);
       RealizePalette(hDC);
   }
  
   // 获取该调色板下新的像素值
   GetDIBits(hDC, hbmp, 0, (UINT) Bitmap.bmHeight,
   (LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,
   (LPBITMAPINFO)lpbi, DIB_RGB_COLORS);
  
   //恢复调色板  
   if (hOldPal)
   {
   SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
   RealizePalette(hDC);
   ::ReleaseDC(NULL, hDC);
   }
  
   //创建位图文件   
   fh = CreateFile(lpFileName, GENERIC_WRITE,
   0, NULL, CREATE_ALWAYS,
   FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
  
//   if (fh == INVALID_HANDLE_value)
  // return FALSE;
  
   // 设置位图文件头
   bmfHdr.bfType = 0x4D42;  // "BM"
   dwDIBSize    = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +
   dwPaletteSize + dwBmBitsSize; 
   bmfHdr.bfSize = dwDIBSize;
   bmfHdr.bfReserved1 = 0;
   bmfHdr.bfReserved2 = 0;
   bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)
   + (DWORD)sizeof(BITMAPINFOHEADER)
   + dwPaletteSize;
   // 写入位图文件头
   WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
   // 写入位图文件其余内容
   WriteFile(fh, (LPSTR)lpbi, dwDIBSize,
   &dwWritten, NULL);
   //消除内存分配 
   GlobalUnlock(hDib);
   GlobalFree(hDib);
   CloseHandle(fh);
   return TRUE;
}

 

调用:
CRect rc;
 rc.bottom=800;
 rc.left=0;
 rc.right=1280;
 rc.top=0;

 CString str= _T("bitmap002.bmp");

 myGetScreenAndSave(rc,str);//即可保存为"bitmap002.bmp"文件