MFC实现屏幕截图

时间:2021-09-13 15:26:30
BOOL CMyDlg::SaveBitmapToFile(HDC hDc, CBitmap & bitmap, LPCTSTR lpszFileName)
{
BOOL ret = TRUE;
BITMAP btm;
bitmap.GetBitmap(&btm);
//本函数用于查看CBitmap对象的信息。返回的信息存放在pBitMap指向的BITMAP结构中
DWORD size = btm.bmWidthBytes * btm.bmHeight;
//分配内存
HGLOBAL hMem = GlobalAlloc(GMEM_FIXED|GMEM_ZEROINIT, size);
if(hMem == NULL)
{
return FALSE;
}

//加锁 保护内存
LPSTR lpData = (LPSTR)GlobalLock(hMem);
//定义位图头结构并初始化
BITMAPINFOHEADER bih;
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biWidth = btm.bmWidth;
bih.biHeight = btm.bmHeight;
bih.biPlanes = 1;
bih.biBitCount = btm.bmBitsPixel;
bih.biCompression = 0;
bih.biSizeImage = size;
bih.biXPelsPerMeter = 0;
bih.biYPelsPerMeter = 0;
bih.biClrUsed = 0;
bih.biClrImportant = 0;

//将位图中的数据以bits形式放入lpData指向的位图数组中
if(GetDIBits(hDc, bitmap, 0, bih.biHeight, lpData,(BITMAPINFO *)&bih, DIB_RGB_COLORS) == 0)
{
GlobalFree(hMem);
return FALSE;
}

//位图文件结构初始化
BITMAPFILEHEADER bfh;
bfh.bfType = ((WORD)('M'<< 8)|'B');
bfh.bfReserved1 = 0;
bfh.bfReserved2 = 0;
bfh.bfSize = sizeof(bfh) + size;
bfh.bfOffBits = sizeof(bfh);

//创建位图文件并写入数据
CFile bf;
if(bf.Open(lpszFileName, CFile::modeCreate | CFile::modeWrite))
{
bf.WriteHuge(&bfh, sizeof(BITMAPFILEHEADER));
bf.WriteHuge(&bih, sizeof(BITMAPINFOHEADER));
bf.WriteHuge(lpData, size);
bf.Close();
}
else
{
ret = FALSE;
}

//释放内存
GlobalFree(hMem);
return ret;
}