Click here to Skip to main content
15,887,349 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Dear All,
I have tested to get Window's DC and try to save the apperence to bitmap.
I find a sample code from net and modified it.
It can let me select the CWnd and then save the window's DC

but while the window is IE and MediaPlayer. The saved bitmap is whole BLACK.

here is my sample code
CFileDialog dlg(false, _T("bmp"), _T("Image"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
		_T("Archivos Bitmap (*.bmp)|*.bmp||"));

	dlg.m_ofn.lpstrTitle = _T("Exportar imagen Bitmap");

	if(dlg.DoModal() == IDOK)
	{

		CBitmap bmpWin;
		CDC memDC;

				
		
		CWindowDC * dc=(CWindowDC*)m_pCWnd->GetDC();
		
		CRect rect;
		m_pCWnd->GetClientRect(&rect);

		bmpWin.CreateCompatibleBitmap(dc, rect.Width(), rect.Height());
		memDC.CreateCompatibleDC(dc);
		memDC.SelectObject(&bmpWin);

		memDC.BitBlt(0, 0, rect.Width(), rect.Height(), dc, 0, 0, SRCCOPY);

		CFile file;
		CFileException e;

		if(!file.Open(dlg.GetPathName(), CFile::modeWrite | CFile::modeCreate, &e))
		{
			e.ReportError();
			return;
		}

		BITMAP bmp;
		bmpWin.GetBitmap(&bmp);

		WORD wColorBits = bmp.bmBitsPixel * bmp.bmPlanes;
		if (wColorBits == 1) 
			wColorBits = 1; 
		else if (wColorBits <= 4) 
			wColorBits = 4; 
		else if (wColorBits <= 8) 
			wColorBits = 8; 
		else if (wColorBits <= 16) 
			wColorBits = 16; 
		else if (wColorBits <= 24) 
			wColorBits = 24; 
		else wColorBits = 32;


		PBITMAPINFO pBitmapInfo;
		pBitmapInfo = (PBITMAPINFO) _alloca(sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * (1 << wColorBits));
		memset(pBitmapInfo, 0, sizeof(BITMAPINFOHEADER));

		pBitmapInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
		pBitmapInfo->bmiHeader.biWidth = bmp.bmWidth; 
		pBitmapInfo->bmiHeader.biHeight = bmp.bmHeight; 
		pBitmapInfo->bmiHeader.biPlanes = bmp.bmPlanes; 
		pBitmapInfo->bmiHeader.biBitCount = bmp.bmBitsPixel; 

		if (wColorBits < 24) 
			pBitmapInfo->bmiHeader.biClrUsed = (1 << wColorBits);

		pBitmapInfo->bmiHeader.biCompression = BI_RGB;

		pBitmapInfo->bmiHeader.biSizeImage = ((pBitmapInfo->bmiHeader.biWidth * wColorBits +31) & ~31) / 8 * pBitmapInfo->bmiHeader.biHeight; 

		pBitmapInfo->bmiHeader.biClrImportant = 0;

		LPBYTE pBits = (LPBYTE) malloc(pBitmapInfo->bmiHeader.biSizeImage);

		if(!GetDIBits(
			memDC,
			bmpWin,
			0,
			pBitmapInfo->bmiHeader.biHeight,
			pBits, 
			pBitmapInfo, 
			DIB_RGB_COLORS))
		{
			AfxMessageBox(_T("Error al crear el Bitmap"));
			free(pBits);
			return;
		}

		BITMAPFILEHEADER fileHeader;
		fileHeader.bfType = 0x4d42;
		fileHeader.bfSize = (DWORD) sizeof(BITMAPFILEHEADER)
			+ pBitmapInfo->bmiHeader.biSizeImage 
			+ pBitmapInfo->bmiHeader.biClrUsed * sizeof(RGBQUAD) 
			+ pBitmapInfo->bmiHeader.biSize; 
		fileHeader.bfReserved1 = 0;
		fileHeader.bfReserved2 = 0;
		fileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) 
			+ pBitmapInfo->bmiHeader.biClrUsed * sizeof(RGBQUAD) 
			+ pBitmapInfo->bmiHeader.biSize;

		try
		{
			file.Write(
				(LPVOID) &fileHeader,
				sizeof(BITMAPFILEHEADER));

			file.Write(
				(LPVOID) pBitmapInfo,
				sizeof(BITMAPINFOHEADER) + pBitmapInfo->bmiHeader.biClrUsed * sizeof(RGBQUAD));

			file.Write(
				(LPVOID) pBits,
				(UINT) pBitmapInfo->bmiHeader.biSizeImage);

			file.Close();

		}

		catch(CFileException* e)
		{
			e->ReportError();
			e->Delete();
			file.SetLength(0);
		}

		free(pBits);
	}
Posted

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900