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

Я пытаюсь сделать снимок экрана основного диалога в приложении 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);

2 ответа

Решение

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

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

Вы создали растровое изображение, но ничего не добавили в него. Вам нужно переключиться с одного 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);
// ...
Другие вопросы по тегам