Контекст GDI в Windows - отображение растровых изображений - PullRequest
1 голос
/ 19 октября 2011

Я хочу поймать кадр рабочего стола и сохранить его в структуре HBITMAP. Затем, после создания правильного контекста устройства памяти из контекста устройства главного окна моего приложения, я бы выбрал в него HBITMAP и использовал StretchBlt для отображения растрового изображения.

Но это работает не так, как ожидалось, потому что оно просто показывает черную рамку. И hdc, и mem_hdc - соответственно контекст устройства и контекст устройства памяти главного окна, инициализированные ранее.

Вот код:

...
hDC desk_hdc, desk_mem_hdc;
BITMAP bitmap;
HBITMAP hbitmap;
desk_hdc = GetDC(NULL);

hbitmap = CreateCompatibleBitmap(desk_hdc, GetDeviceCaps(desk_hdc, HORZRES), GetDeviceCaps(desk_hdc, VERTRES));
GetObject(hbitmap, sizeof(BITMAP), &bitmap);
SelectObject(mem_hdc, hbitmap);
StretchBlt(hdc, 0, 0, 1024, 768, mem_hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY|CAPTUREBLT|NOMIRRORBITMAP);
...

1 Ответ

2 голосов
/ 19 октября 2011

Исходный постоянный ток вашей StretchBlt операции - mem_hdc, который имеет совместимое неинициализированное растровое изображение. Вот почему вы получаете черную рамку.

Если вы хотите захватить содержимое рабочего стола, вы должны сначала скопировать его в растровое изображение в вашем mem_hdc. Сразу после SelectObject сделайте:

BitBlt( mem_hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, desk_hdc, 0, 0, SRCCOPY );
...