写截屏软件的函数

来源:互联网 发布:销售是干嘛的知乎 编辑:程序博客网 时间:2024/06/05 02:46

原文来自:http://tmzhjw.bokee.com/viewdiary.14020399.html

//*********************增加的函数**********************************************************
//考贝屏幕,这段代码是拿来主义 呵呵
HBITMAP CCatchScreenDlg::CopyScreenToBitmap(LPRECT lpRect,BOOL bSave)
//lpRect 代表选定区域
{
 HDC       hScrDC, hMemDC;     
 // 屏幕和内存设备描述表
 HBITMAP    hBitmap, hOldBitmap;  
 // 位图句柄
 int       nX, nY, nX2, nY2;     
 // 选定区域坐标
 int       nWidth, nHeight;
 
 // 确保选定区域不为空矩形
 if (IsRectEmpty(lpRect))
  return NULL;
 //为屏幕创建设备描述表
 hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);

 //为屏幕设备描述表创建兼容的内存设备描述表
 hMemDC = CreateCompatibleDC(hScrDC);
 // 获得选定区域坐标
 nX = lpRect->left;
 nY = lpRect->top;
 nX2 = lpRect->right;
 nY2 = lpRect->bottom;

 //确保选定区域是可见的
 if (nX < 0)
  nX = 0;
 if (nY < 0)
  nY = 0;
 if (nX2 > m_xScreen)
  nX2 = m_xScreen;
 if (nY2 > m_yScreen)
  nY2 = m_yScreen;
 nWidth = nX2 - nX;
 nHeight = nY2 - nY;
 // 创建一个与屏幕设备描述表兼容的位图
 hBitmap = CreateCompatibleBitmap
  (hScrDC, nWidth, nHeight);
 // 把新位图选到内存设备描述表中
 hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
 // 把屏幕设备描述表拷贝到内存设备描述表中
 if(bSave)
 {
  CDC dcCompatible;
  dcCompatible.CreateCompatibleDC(CDC::FromHandle(hMemDC));
  dcCompatible.SelectObject(m_pBitmap);
       
  BitBlt(hMemDC, 0, 0, nWidth, nHeight,
   dcCompatible, nX, nY, SRCCOPY);

 }
 else
 {
  BitBlt(hMemDC, 0, 0, nWidth, nHeight,
   hScrDC, nX, nY, SRCCOPY);
 }

 hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
 //得到屏幕位图的句柄
 //清除
 DeleteDC(hScrDC);
 DeleteDC(hMemDC);
 // 返回位图句柄
 if(bSave)
 {
    
  if (OpenClipboard())
  {
        //清空剪贴板
        EmptyClipboard();
        //把屏幕内容粘贴到剪贴板上,
        //hBitmap 为刚才的屏幕位图句柄
        SetClipboardData(CF_BITMAP, hBitmap);
        //关闭剪贴板
        CloseClipboard();
      }
 }
 return hBitmap;
}

 

 

// 把位图指针所选图形写入文件  
  int   CCatchScreenDlg::SaveBitmapToFile(HBITMAP   hBitmap,   const   char*   lpFileName)  
  {            
  HDC hDC; //设备描述表  
  int iBits; //当前显示分辨率下每个像素所占字节数  
  WORD wBitCount; //位图中每个像素所占字节数  
   
  //定义调色板大小,   位图中像素字节大小   ,位图文件大小   ,   写入文件字节数  
  DWORD dwPaletteSize=0;  
  DWORD dwBmBitsSize;  
  DWORD dwDIBSize,   dwWritten;  
   
  BITMAP Bitmap;                 //位图属性结构  
  BITMAPFILEHEADER bmfHdr;                 //位图文件头结构  
  BITMAPINFOHEADER bi;                         //位图信息头结构    
  LPBITMAPINFOHEADER lpbi;                     //指向位图信息头结构  
   
  HANDLE fh,   hDib,   hPal,hOldPal=NULL; //定义文件,分配内存句柄,调色板句柄  
   
  //计算位图文件每个像素所占字节数  
  hDC   =   CreateDC("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   if   (iBits   <=   32)  
  wBitCount   =   32;  
   
  //计算调色板大小  
  if   (wBitCount   <=   8)  
  dwPaletteSize   =   (wBitCount)   *sizeof(RGBQUAD);  
   
  //设置位图信息头结构  
  GetObject(hBitmap,   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));  
  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,   hBitmap,   0,   (UINT)   Bitmap.bmHeight,  
  (LPSTR)lpbi   +   sizeof(BITMAPINFOHEADER)+dwPaletteSize,  
  (BITMAPINFO*)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;  
  }