Чтение онлайн

на главную - закладки

Жанры

Шрифт:

Следующий пример демонстрирует, как можно получать изображения всего Рабочего стола, а также как полученное изображение можно масштабировать. В данном приложении мы будем обрабатывать три события формы: 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).

...

Листинг 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 с необходимыми комментариями.

...

Листинг 6.10.

Подготовка необходимых данных

//получаем размеры клиентской области

Windows.GetClientRect(hWnd, rt);

//рассчитываем ширину и высоту клиентской области

ulWindowWidth := rt.right – rt.left;

ulWindowHeight := rt.bottom – rt.top;

if (ulWindowWidth = 0) or (ulWindowHeight = 0) then

Exit;

//делим окно на три горизонтальные области

ulWindowHeight := ulWindowHeight div 3;

//создаем контекст устройства для нашего точечного рисунка

hCurDC := CreateCompatibleDC(hdcwnd);

ZeroMemory(@bmi, sizeof(BITMAPINFO));

//Устанавливаем параметры точечного рисунка.

//Указываем ширину и высоту точечного рисунка для каждой

//из трех горизонтальных областей

//равными 60 % ширины и высоты главного окна.

//Смешивание в центре каждой из этих трех областей

with bmi.bmiHeader do

begin

biSize := sizeof(BITMAPINFOHEADER);

biWidth := ulWindowWidth – (ulWindowWidth div 5) * 2;

ulBitmapWidth := biWidth;

biHeight := ulWindowHeight – (ulWindowHeight div 5) * 2;

ulBitmapHeight := biHeight;

biPlanes := 1;

biBitCount := 32; //четыре восьмибитных составляющих

biCompression := BI_RGB;

biSizeImage := ulBitmapWidth * ulBitmapHeight * 4;

end;

//создаем DIB секцию и выбираем точечный рисунок в контексте

устройства

hbmp := CreateDIBSection(hCurDC, bmi, DIB_RGB_COLORS, pvBits,

0, 0);

SelectObject(hCurDC, hbmp);

Поделиться:
Популярные книги

Как я строил магическую империю 4

Зубов Константин
4. Как я строил магическую империю
Фантастика:
боевая фантастика
постапокалипсис
аниме
фантастика: прочее
фэнтези
5.00
рейтинг книги
Как я строил магическую империю 4

Безумный Макс. Поручик Империи

Ланцов Михаил Алексеевич
1. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
7.64
рейтинг книги
Безумный Макс. Поручик Империи

Попаданка 3

Ахминеева Нина
3. Двойная звезда
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Попаданка 3

Муж на сдачу

Зика Натаэль
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Муж на сдачу

Призыватель нулевого ранга. Том 3

Дубов Дмитрий
3. Эпоха Гардара
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Призыватель нулевого ранга. Том 3

На границе империй. Том 10. Часть 5

INDIGO
23. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 5

Адвокат

Константинов Андрей Дмитриевич
1. Бандитский Петербург
Детективы:
боевики
8.00
рейтинг книги
Адвокат

На границе империй. Том 7

INDIGO
7. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
6.75
рейтинг книги
На границе империй. Том 7

Здравствуй, 1985-й

Иванов Дмитрий
2. Девяностые
Фантастика:
альтернативная история
5.25
рейтинг книги
Здравствуй, 1985-й

О, Путник!

Арбеков Александр Анатольевич
1. Квинтет. Миры
Фантастика:
социально-философская фантастика
5.00
рейтинг книги
О, Путник!

Чужбина

Седой Василий
2. Дворянская кровь
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чужбина

Бестужев. Служба Государевой Безопасности. Книга четвертая

Измайлов Сергей
4. Граф Бестужев
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бестужев. Служба Государевой Безопасности. Книга четвертая

Локки 5. Потомок бога

Решетов Евгений Валерьевич
5. Локки
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Локки 5. Потомок бога

На границе империй. Том 10. Часть 4

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 4