[代碼收集] 窗口截屏並保存爲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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章