[代码收集] 窗口截屏并保存为bmp图片

int SaveBitmapToFile(HBITMAP hBitmap, LPSTR lpFileName)
{
	//我们也可以把屏幕内容以位图格式存到磁盘文件上.
	//lpFileName 为位图文件名
	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("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 <= 32)
		wBitCount = 24;
	//计算调色板大小
	if (wBitCount <= 8)
		dwPaletteSize = (1 <<  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=(HPALETTE)::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;      
}

void CTestDlg::OnBnClickedButton1()
{
	//设定截图区域的宽高..
	int width = 1024,
		height = 768;
	//设定所要截取窗口的句柄, 此处是获取桌面窗口.
	HDC hDC = ::GetDC( ::GetDesktopWindow());
	//
	HDC hComDC=CreateCompatibleDC(hDC);
	HBITMAP hBmp = CreateCompatibleBitmap(hDC,width,height);
	HBITMAP hOldBmp = (HBITMAP)SelectObject(hComDC,hBmp);
	BitBlt( hComDC,0,0,width,height,hDC,0,0,SRCCOPY );
	SelectObject( hComDC,hOldBmp );
	DeleteDC( hDC );
	
	SaveBitmapToFile( hBmp, "c:\\a.bmp" );

	DeleteObject(hBmp);
}


 

发布了19 篇原创文章 · 获赞 8 · 访问量 11万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章