После того как создан совместимый контекст устройства и выбран соответствующий точечный рисунок, вы можете запоминать изображение. Функция BitBlt получает изображение, а также копирует данные из исходного точечного рисунка и помещает их в точечный рисунок приемника. Однако два параметра функции не являются описателями точечных рисунков. Вместо этого функция получает два описателя контекстов устройств и копирует растровые данные из точечного рисунка, выбранного в исходном контексте устройства, в точечный рисунок, выбранный в целевом контексте устройства. В этом случае целевой контекст устройства является совместимым контекстом устройства. Когда копирование растровых данных завершается, изображение помещается в память. Чтобы восстановить изображение, вызовите повторно BitBlt, указав теперь в качестве источника совместимый контекст устройства и в качестве приемника контекст устройства экрана (принтера и т. д.).
Следующий пример демонстрирует, как можно получать изображения всего Рабочего стола, а также как полученное изображение можно масштабировать. В данном приложении мы будем обрабатывать три события формы: OnCreate, OnPaint, OnClose, а также одно событие кнопки Onclick.
Рассмотрим исходный код обработчика события OnCreate (листинг 6.5).
Листинг 6.5. Обработчик события OnCreate
procedure TfmCaptureImage.FormCreate(Sender: TObject);
begin
//создаем контекст устройства экрана
hdcScreen := CreateDC(\'DISPLAY\', nil, nil, nil);
//создаем совместимый контекст устройства памяти
hdcCompatible := CreateCompatibleDC(hdcScreen);
bmpWidth := GetDeviceCaps(hdcScreen, HORZRES);
bmpHeight := GetDeviceCaps(hdcScreen, VERTRES);
//создаем совместимый точечный рисунок для hdcScreen
hbmScreen := CreateCompatibleBitmap(hdcScreen, bmpWidth,
bmpHeight);
if hbmScreen <> 0 then
hOldBitmap := SelectObject(hdcCompatible, hbmScreen)
else
hOldBitmap := 0;
Captured := False;
end;
Здесь происходит создание контекста устройства Рабочего стола посредством вызова функции CreateDC.
hdcScreen:= CreateDC(\'DISPLAY\', nil, nil, nil);
После этого создается совместимый контекст устройства памяти для только что основанного контекста. Затем создается совместимый точечный рисунок.
bmpWidth := GetDeviceCaps(hdcScreen, HORZRES);
bmpHeight := GetDeviceCaps(hdcScreen, VERTRES);
//создаем совместимый точечный рисунок для hdcScreen
hbmScreen := CreateCompatibleBitmap(hdcScreen, bmpWidth, bmpHeight);
Если нам удалось создать совместимый точечный рисунок, то выбираем его в совместимом контексте устройства памяти. Еще мы вводим флаг, который указывает, сохранено ли в данный момент изображение. Все полученные данные сохраняются в полях формы, объявленных при описании ее класса.
hdcScreen, hdcCompatible: HDC;
hbmScreen, hOldBitmap: HBITMAP;
bmpWidth, bmpHeight: Integer;
Captured: LongBool;
Рассмотрим исходный код обработчика события OnPaint (листинг 6.6).
Листинг 6.6.
Обработчик события OnPaint
procedure TfmCaptureImage.FormPaint(Sender: TObject);
var
hCurDC: HDC;
begin
if Captured then
begin
hCurDC := GetDC(Handle);
StretchBlt(hCurDC, 0, 0, Width, Height, hdcCompatible,
0, 0, bmpWidth, bmpHeight, SRCCOPY);
ReleaseDC(Handle, hCurDC);
end;
end;
Проверяем, есть ли изображение, которое нам необходимо показывать. Если да, то получаем контекст устройства нашего окна и масштабируем на него полученное изображение при помощи функции StretchBlt.
Перед закрытием формы мы должны освободить занятые нами ресурсы системы. Поэтому мы обрабатываем событие OnClose, исходный код обработчика которого приведен ниже (листинг 6.7).