当前位置:编程学习 > C/C++ >>

保存屏幕BMP

[cpp] 
HBITMAP CopyScreenToBitmap(LPRECT lpRect) 

     //屏幕和内存设备描述表 
     HDC hSrcDC, hMemDC; 
     //位图句柄 
     HBITMAP hBitmap, hOldBitmap; 
     //选定区域坐标 
     int nX, nY, nX2, nY2; 
     //位图宽度和高度 
     int nWidth, nHeight; 
     //屏幕分辨率 
     int xScrn, yScrn; 
  
     //确保选定区域不为空矩形 
     if(IsRectEmpty(lpRect)) 
      return NULL; 
     //为屏幕创建设备描述表 
     hSrcDC = CreateDC("DISPLAY", NULL, NULL, NULL); 
     //为屏幕设备描述表创建兼容的内存设备描述表 
     hMemDC = CreateCompatibleDC(hSrcDC); 
     //获得选定区域坐标 
     nX = lpRect->left; 
     nY = lpRect->top; 
     nX2 = lpRect->right; 
     nY2 = lpRect->bottom; 
     //获得屏幕分辨率 
     xScrn = GetDeviceCaps(hSrcDC, HORZRES); 
     yScrn = GetDeviceCaps(hSrcDC, VERTRES); 
     //确保选定区域是可见的 
     if(nX<0) 
        nX = 0; 
     if(nY<0) 
        nY = 0; 
     if(nX2>xScrn) 
        nX2 = xScrn; 
     if(nY2>yScrn) 
        nY2 = yScrn; 
     nWidth = nX2 - nX; 
     nHeight = nY2 - nY; 
     //创建一个与屏幕设备描述表兼容的位图 
     hBitmap = CreateCompatibleBitmap(hSrcDC, nWidth, nHeight); 
     //把新位图选到内存设备描述表中 
     hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap); 
     //把屏幕设备描述表拷贝到内存设备描述表中 
     BitBlt(hMemDC, 0, 0, nWidth, nHeight, hSrcDC, nX, nY, SRCCOPY); 
     //得到屏幕位图的句柄 
     hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap); 
     //清除 
     DeleteDC(hSrcDC); 
     DeleteDC(hMemDC); 
     //返回位置句柄 
     return hBitmap; 

HBITMAP CopyScreenToBitmap(int x1, int x2, int y1, int y2) 

     //屏幕和内存设备描述表 
     HDC hSrcDC, hMemDC; 
     //位图句柄 
     HBITMAP hBitmap, hOldBitmap; 
     //选定区域坐标 
     int nX, nY, nX2, nY2; 
     //位图宽度和高度 
     int nWidth, nHeight; 
     //屏幕分辨率 
     int xScrn, yScrn; 
     /*
     //确保选定区域不为空矩形
     if(IsRectEmpty(lpRect))
     return NULL;*/ 
     //为屏幕创建设备描述表 
     hSrcDC = CreateDC("DISPLAY", NULL, NULL, NULL); 
     //为屏幕设备描述表创建兼容的内存设备描述表 
     hMemDC = CreateCompatibleDC(hSrcDC); 
     //获得选定区域坐标 
     nX = x1; 
     nY = y1; 
     nX2 = x2; 
     nY2 = y2; 
     //获得屏幕分辨率 
     xScrn = GetDeviceCaps(hSrcDC, HORZRES); 
     yScrn = GetDeviceCaps(hSrcDC, VERTRES); 
     //确保选定区域是可见的 
     if(nX<0) 
        nX = 0; 
     if(nY<0) 
        nY = 0; 
     if(nX2>xScrn) 
        nX2 = xScrn; 
     if(nY2>yScrn) 
        nY2 = yScrn; 
     nWidth = nX2 - nX; 
     nHeight = nY2 - nY; 
     //创建一个与屏幕设备描述表兼容的位图 
     hBitmap = CreateCompatibleBitmap(hSrcDC, nWidth, nHeight); 
     //把新位图选到内存设备描述表中 
     hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap); 
     //把屏幕设备描述表拷贝到内存设备描述表中 
     BitBlt(hMemDC, 0, 0, nWidth, nHeight, hSrcDC, nX, nY, SRCCOPY); 
     //得到屏幕位图的句柄 
     hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap); 
     //清除 
     DeleteDC(hSrcDC); 
     DeleteDC(hMemDC); 
     //返回位置句柄 
     return hBitmap; 

BOOL SaveCapturedBitmap(HBITMAP hBitmap, CString FileName) 

     if(hBitmap==NULL || FileName.IsEmpty()) 
     { 
      AfxMessageBox("参数错误"); 
      return false; 
     } 
  
     HDC hDC; 
     //当前分辨率下每象素所占字节数 
     int iBits; 
     //位图中每象素所占字节数 
     WORD wBitCount; 
     //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数 
     DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0; 
     //位图属性结构 
     BITMAP Bitmap;  
     //位图文件头结构 
     BITMAPFILEHEADER bmfHdr;  
     //位图信息头结构 
     BITMAPINFOHEADER bi;  
     //指向位图信息头结构  
     LPBITMAPINFOHEADER lpbi;  
     //定义文件,分配内存句柄,调色板句柄 
     HANDLE fh, hDib, hPal,hOldPal=NULL; 
  
     //计算位图文件每个像素所占字节数 
&n
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,