截屏函数,包含DDBtoDIB

写远控时写的:

 

void GetScreen(LPTSTR path)
{
 DWORD BmpSize,offbits;
 CDC hDc,hCompatibleDc;
 hDc.CreateDC(L"Display", NULL, NULL, NULL);//屏幕设备上下文
 hCompatibleDc.CreateCompatibleDC(&hDc);//内存兼容性设备上下文
 CBitmap BmpCatch;
 BmpCatch.CreateCompatibleBitmap(&hDc, hDc.GetDeviceCaps(HORZRES), hDc.GetDeviceCaps(VERTRES));//兼容性位图
 hCompatibleDc.SelectObject(BmpCatch);


 hCompatibleDc.BitBlt(0, 0, hDc.GetDeviceCaps(HORZRES), hDc.GetDeviceCaps(VERTRES), &hDc, 0, 0, SRCCOPY);//获取设备信息


 HANDLE hBmp = DDBtoDIB(BmpCatch, BI_RGB, &BmpSize, &offbits);


 BITMAPFILEHEADER bmpfile;//文件头信息
 bmpfile.bfType = ((WORD)('M'<<8|'B'));
 bmpfile.bfSize = BmpSize;
 bmpfile.bfReserved1 = 0;
 bmpfile.bfReserved2 = 0;
 bmpfile.bfOffBits = offbits + sizeof(BITMAPFILEHEADER);
 HANDLE hFile = CreateFile(path, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
 DWORD dwWrite;

 

//全部写入
 WriteFile(hFile, &bmpfile, sizeof(BITMAPFILEHEADER), &dwWrite, NULL);
 WriteFile(hFile, hBmp, bmpfile.bfSize, &dwWrite, NULL);


 DeleteDC(hDc);
 GlobalFree(hBmp); 
 CloseHandle(hFile);
}

 

 

HANDLE DDBtoDIB(CBitmap& BmpCatch, DWORD dwCompression, DWORD* bmpsize, DWORD* offbits)//设备依赖转设备无依赖
{
 BITMAP bmp;
 BITMAPINFOHEADER bmphead;//信息头
 LPBITMAPINFOHEADER lpbmphead;
 DWORD len;
 HPALETTE hPal = (HPALETTE)GetStockObject(DEFAULT_PALETTE);
 HDC hDC;
 HANDLE hDIB;

 BmpCatch.GetObject(sizeof(bmp), &bmp);

 bmphead.biSize = sizeof(BITMAPINFOHEADER);
 bmphead.biWidth = bmp.bmWidth;
 bmphead.biHeight = bmp.bmHeight;
 bmphead.biPlanes = 1;
 bmphead.biBitCount = bmp.bmBitsPixel;
 bmphead.biCompression = dwCompression;
 bmphead.biSizeImage = 0;
 bmphead.biXPelsPerMeter = 0;
 bmphead.biYPelsPerMeter = 0;
 bmphead.biClrUsed = 0;
 bmphead.biClrImportant = 0;

 int nColors = ( 1 << bmphead.biBitCount );
 if ( bmphead.biBitCount > 8 )nColors = 0;
 len = bmphead.biSize + nColors * sizeof(RGBQUAD);//bmp信息头大小+调色板大小

 hDC  =  GetDC(NULL); 
 hPal  =  SelectPalette(hDC,hPal,FALSE); 
 RealizePalette(hDC);

 hDIB  =  GlobalAlloc(GMEM_FIXED,len);

 if ( !hDIB )
 { 
  SelectPalette(hDC,hPal,FALSE); 
  ReleaseDC(NULL,hDC); 
  return  NULL; 
 }

 lpbmphead = (LPBITMAPINFOHEADER)hDIB;


 *lpbmphead = bmphead;


 GetDIBits(hDC, (HBITMAP)BmpCatch.GetSafeHandle(), 0, bmp.bmHeight, NULL, (LPBITMAPINFO)lpbmphead, DIB_RGB_COLORS);//获取bmp实质内容大小

 bmphead = *lpbmphead;

 if ( !bmphead.biSizeImage )//未成功自己计算
 {
  bmphead.biSizeImage = ((((bmphead.biWidth * bmphead.biBitCount) + 31) & ~31) >> 3 ) * bmphead.biHeight;
 }
 len += bmphead.biSizeImage;//大小增加

 if ( !(hDIB = GlobalReAlloc(hDIB, len, GMEM_MOVEABLE)) )
 {
  GlobalFree(hDIB);
  SelectPalette(hDC,hPal,FALSE); 
  ReleaseDC(NULL,hDC); 
  return  NULL; 
 }

 lpbmphead = (LPBITMAPINFOHEADER)hDIB;

 int nScan = GetDIBits(hDC, (HBITMAP)BmpCatch.GetSafeHandle(), 0, bmp.bmHeight,(LPSTR)lpbmphead + bmphead.biSize + nColors * sizeof(RGBQUAD),
  (LPBITMAPINFO)lpbmphead, DIB_RGB_COLORS);//实现DDB转换入内存缓冲区(与设备脱离依赖)
 if ( !nScan )
 {
  GlobalFree(hDIB); 
  SelectPalette(hDC,hPal,FALSE); 
  ReleaseDC(NULL,hDC); 
  return  NULL;
 }
 *bmpsize = len;
 *offbits = bmphead.biSize + nColors * sizeof(RGBQUAD);
 SelectPalette(hDC,hPal,FALSE); 
 ReleaseDC(NULL,hDC); 
 return  hDIB;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值