Листинг 6.7.
Обработчик события OnClose
procedure TfmCaptureImage.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
//восстанавливаем точечный рисунок по умолчанию
if hOldBitmap <> 0 then
SelectObject(hdcCompatible, hOldBitmap);
//удаляем совместимый точечный рисунок
if hbmScreen <> 0 then
DeleteObject(hbmScreen);
//удаляем совместимый контекст устройства памяти
if hdcCompatible <> 0 then
DeleteDC(hdcCompatible);
//удаляем контекст устройства экрана
if hdcScreen <> 0 then
DeleteDC(hdcScreen);
end;
Нам осталось рассмотреть последний обработчик события Onclick кнопки, помещенной на нашу форму. В нем мы прячем окно, сохраняем изображение экрана и затем показываем наше окно (листинг 6.8).
Листинг 6.8.
Сохранение захваченного изображения
procedure TfmCaptureImage.btnCaptureClick(Sender: TObject);
var
hdcForm: HDC;
begin
//прячем наше окно
Hide;
//сохраняем текущее изображение экрана
Captured := BitBlt(hdcCompatible, 0, 0, bmpWidth, bmpHeight,
hdcScreen, 0, 0, SRCCOPY);
//показываем наше окно
Show;
end;
В итоге мы создали довольно простое приложение, которое способно получать изображение всего Рабочего стола. Результат работы приложения приведен на рис. 6.3.
Рис. 6.3. Результат работы приложения «Захват изображения»
6.9. Альфа-смешивание
Здесь мы рассмотрим пример, иллюстрирующий, как осуществлять альфа-смешивание точечного рисунка. Мы создадим приложение, в котором окно делится на три горизонтальные области. Затем создается точечный рисунок с альфа-смешиванием в каждой из областей окна следующим образом:
• в верней области постоянная альфа = 50
• в средней области постоянная альфа = 100 % и исходная альфа = 0 %;
• в нижней области постоянная альфа = 75 % и исходная альфа переменная.
Добавим в описание нашей формы процедуру со следующим форматом заголовка:
procedure DrawAlphaBlend(hWnd: HWND; hdcwnd: HDC);
В самой процедуре объявим ряд переменных, которые нам понадобятся в процессе работы. Объявление приведено в листинге 6.9.
Листинг 6.9.
Объявление переменных
var
hCurDC: HDC; //описатель контекста устройства,
//который мы создадим
bf: BLENDFUNCTION; //запись альфа-смешивания
hbmp: HBITMAP; //дескриптор точечного рисунка
bmi: BITMAPINFO; //заголовок точечного рисунка
pvBits: Pointer; //pointer to DIB section
ulWindowWidth, ulWindowHeight: ULONG; //ширина/высота
//клиентской области
ulBitmapWidth, ulBitmapHeight: ULONG; //ширина/высота
//точечного рисунка
rt: TRect; //используется для получения размера
//клиентской области
x,y: Integer; //циклические переменные
ubAlpha: UCHAR; //используется для создания
//прозрачного градиента
ubRed: UCHAR;
ubGreen: UCHAR;
ubBlue: UCHAR;
fAlphaFactor: Real;
r, g, b: UCHAR;
В самом начале процедуры осуществляем подготовку необходимых данных для альфа-смешивания. Данные содержат информацию о требуемых размерах, а также необходимые данные точечного рисунка. Рассмотрите листинг 6.10 с необходимыми комментариями.