如何在没有空白黑色的情况下获得IE的DC

问题描述:

亲爱的所有人,

我已经测试过获取Window的DC并尝试将其隐藏到位图。

我从网上找到一个示例代码并对其进行修改。

它可以让我选择CWnd,然后保存窗口的DC



但窗口是IE和MediaPlayer。保存的位图是全黑的。



这里是我的示例代码

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);
	}