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