Снимок экрана возвращает только черное изображение

Я пытаюсь сделать снимок экрана основного диалога в приложении MFC и сохранить его в виде файла изображения. Я пробовал каждый пример, который мог найти в Интернете, и всегда получал один и тот же результат: файл изображения имеет правильные размеры (для большей уверенности я пробовал это с диалоговыми окнами, отличными от основного), но он черный. Мое последнее решение — использовать класс CBitmap для передачи дескриптора основного диалога в CImage. Вот мой код:

CWnd* mainWindow;
CDC* mainWindowDC;
CBitmap bitmapToSave;
CImage imageToSave;
CRect windowRect;

//Get main window context and create bitmap from it
mainWindow = AfxGetMainWnd();
mainWindowDC = mainWindow->GetWindowDC();
mainWindow->GetWindowRect(&windowRect);
bitmapToSave.CreateCompatibleBitmap(mainWindowDC, windowRect.Width(), windowRect.Height());
imageToSave.Attach(bitmapToSave);
imageToSave.Save("C:\\Capture\\image.bmp", Gdiplus::ImageFormatBMP);

1

Решение

Вот способ сделать это:

HRESULT CaptureScreen(const CString& sImageFilePath)
{
CWnd* pMainWnd = AfxGetMainWnd();
CRect rc;
pMainWnd->GetWindowRect(rc);
CImage img;
img.Create(rc.Width(), rc.Height(), 24);
CDC memdc;
CDC* pDC = pMainWnd->GetWindowDC();
memdc.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = memdc.SelectObject(CBitmap::FromHandle((HBITMAP)img));
memdc.BitBlt(0, 0, rc.Width(), rc.Height(), pDC, 0, 0, SRCCOPY);
memdc.SelectObject(pOldBitmap);
return img.Save(sImageFilePath, Gdiplus::ImageFormatPNG);
}

Пожалуйста, взгляните также на эту хорошую реализацию: http://www.codeguru.com/cpp/article.php/c18347/C-Programming-Easy-Screen-Capture-Using-MFCATL.htm

1

Другие решения

Вы создали растровое изображение, но вы ничего не добавили в него. Вам нужно переключиться с одного DC на другой, чтобы сделать копию того, что на экране.

// ...
CMemDC dcMem;
dcMem.CreateCompatibleDC(&mainWindowDC);
CBitmap * pOld = dcMem.SelectObject(&bitmapToSave);
dcMem.BitBlt(0, 0, windowRect.Width(), windowRect.Height(), &mainWindowDC, windowRect.left, windowRect.top, SRCCOPY);
dcMem.SelectObject(pOld);
// ...
1

По вопросам рекламы [email protected]