Почему скриншот не отображается в моем окне с помощью функций SelectObject и BitBlt? - PullRequest
1 голос
/ 31 марта 2011

Я пытаюсь получить скриншот 500x500 из позиции экрана 0x0 (в верхнем левом углу) и поместить его в окно.

Вот мой код (hwnd - мой дескриптор окна):

HDC appDc = GetDC(hwnd);
HDC dc = GetDC(NULL);
HBITMAP bitmap = CreateCompatibleBitmap(dc, 500, 500);
HDC memoryDc = CreateCompatibleDC(dc);
SelectObject(memoryDc, bitmap);
BitBlt(appDc, 0, 0, 500, 500, dc, 0, 0, SRCCOPY);
ShowWindow(hwnd, SW_SHOW);
SetWindowText(hwnd, _T("Window"));   

Что мне здесь не хватает?Я получаю черный внутри окна вместо захвата экрана.

РЕДАКТИРОВАТЬ

Это работает после того, как я изменил memoryDc на dc Раньше было BitBlt(appDc, 0, 0, 500, 500, memoryDc, 0, 0, SRCCOPY); Но теперь проблема заключается в SelectObjectне работает. Я имел в виду, что не помещать изображение в HBITMAP.Однако BitBlt копирует из dc в appDc

Ответы [ 2 ]

1 голос
/ 31 марта 2011

Во-первых, кажется, что существует путаница с контекстами устройства.Вы переходите с memoryDc на appDc, но memoryDc ничего не содержит - он создан для совместимости с dc, но это не означает, что он разделяет контент.Кроме того, вы не освобождаете контроллеры домена в своем примере.

Во-вторых, ваш вызов ShowWindow () подразумевает, что окно раньше не было видно.Если это так, то все, что было «нарисовано» ранее, на самом деле не было нарисовано и не будет видно в окне.Захват содержимого экрана в растровое изображение и отображение его во время WM_PAINT.

0 голосов
/ 31 марта 2011

Поскольку вы вызываете ShowWindow для окна вашего приложения в конце блока кода, я предполагаю, что это окно не видно до этого времени.

Если так, тогда это ваша проблема, потому что, когда невидимое окно снова становится видимым, его клиентская область всегда перекрашивается.Это приводит к тому, что его фон стирается с помощью кисти по умолчанию для этого окна (по-видимому, черной кисти в вашем случае), и все, что вы рисовали (используя функцию BitBlt) в контексте устройства (DC), теряется.

Лучшим подходом было бы нарисовать снимок экрана во временную битовую карту.Затем просто сохраните копию этого растрового изображения и нарисуйте его в окне всякий раз, когда вы получите сообщение WM_PAINT.

...