将窗口截图存为Bmp的C++代码

备份一份代码,用于窗口截图~!

使用的时候只需要调用Catchfile函数就可以了。

当然,代码中的WIDTH、MARGIN、 HEIGHT等还得按需要进行设定。

 

void CMyDialog::Catchfile() 
{
	HBITMAP hBitmap = GetSrcBit();

	if (hBitmap != NULL) 
	{
		// szFilters is a text string that includes two file name filter:
		// "*.bmp" for "bmp Files" and "*.*" for "All Files."
		char szFilters[]=
			"bmp Files (*.bmp)|*.bmp|All Files (*.*)|*.*||";

		// Create a Save dialog; the default file name extension is ".bmp".
		CFileDialog fileDlg (FALSE, "bmp", "*.bmp",
			OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, szFilters, this);

		// Display the file dialog. When user clicks OK, fileDlg.DoModal() 
		// returns IDOK.
		if( fileDlg.DoModal() == IDOK )
		{
			CString pathName = fileDlg.GetPathName();

			// Implement opening and reading file in here.
			//...
			//Change the window's title to the opened file's title.
			//CString fileName = fileDlg.GetFileTitle ();

			//SetWindowText(fileName);
			SaveBitmapToFile(hBitmap , pathName.GetBuffer()/*LPSTR lpFileName*/);
		}
	}
}


void CMyDialog::GetSrcBit(/*DWORD BitWidth, DWORD BitHeight*/void)
{
	HBITMAP hBitmap,hOldBitmap;
	CPaintDC dc(this);
	HDC hmyMemDC = CreateCompatibleDC(dc.m_hDC);
	hBitmap = CreateCompatibleBitmap(dc.m_hDC, WIDTH-MARGIN, HEIGHT);
	hOldBitmap = (HBITMAP)SelectObject(hmyMemDC, hBitmap);

	BitBlt(hmyMemDC, 0, 0, WIDTH, HEIGHT,dc.m_hDC, 0, 0, SRCCOPY);


	hBitmap = (HBITMAP)SelectObject(hmyMemDC, hOldBitmap);

	return (hBitmap);
}

// 我们也可以把屏幕内容以位图格式存到磁盘文件上.
// lpFileName 为位图文件脕E     
int CMyDialog::SaveBitmapToFile(HBITMAP hBitmap , LPSTR lpFileName) 
{
	
	HDC	hDC;      //设备描述句柄		
	int iBits;    //当前显示分辨率下每个像素所占字节数  
	
	WORD wBitCount;   //位图中每个像素所占字节数

	//定义调色板大小, 位图中像素字节大小 ,
	//位图文件大小
	DWORD  dwPaletteSize=0,
		   dwBmBitsSize,
		   dwDIBSize, dwWritten;
	
	BITMAP	 Bitmap;  //位图属性结构		
	BITMAPFILEHEADER	bmfHdr;  //位图文件头结构

	//位图信息头结构 
	BITMAPINFOHEADER	bi;

	//指向位图信息头结构
	LPBITMAPINFOHEADER lpbi;

	//定义文件,分配内存句柄,调色板句眮E
	HANDLE   fh, hDib;
	HPALETTE 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 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 ;
	//为位图内容分配内磥E
	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, hPal, FALSE);
		RealizePalette(hDC);
	}

	// 获取该调色板下新的像素值
	GetDIBits(hDC, hBitmap, 0, (UINT)Bitmap.bmHeight,(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,(LPBITMAPINFO)lpbi, DIB_RGB_COLORS);

	//恢复调色皝E  
	if (hOldPal)
	{
		SelectPalette(hDC, 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;																	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值