Читаем Графика DirectX в Delphi полностью

Особенно интересным для этого примера является использование в качестве фона "тайлового", зацикленного образа. Фон окна состоит из нескольких повторяющихся одинаковых фрагментов, состыкованных друг с другом. Так получается бесконечный образ фона.

Чтобы получить простейший хранитель экрана, достаточно переименовать исполняемый модуль любого полноэкранного приложения в файл с расширением scr и поместить его в папку System системного каталога (как правило, это C:\Windows\System\).

Но, чтобы хранитель экрана не выбивался из ряда других "скринсэйверов", необходимо хорошенько потрудиться. Так, следует обеспечить его работу в небольшом окне при предварительном просмотре, когда пользователь выбирает вкладку Заставка при задании свойств экрана (рис. 4.3).

Итак, у хранителя экрана должны быть оконный и полноэкранный режимы работы. Причем, совсем не нужно делать приложение комбинированным,

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

Далее, необходимо снабдить приложение диалоговыми окнами настройки параметров работы и задания пароля для выхода. И еще, на тот случай, если указан пароль, следует предусмотреть режим просмотра, при выходе из которого пароль не вводится и комбинация клавиш ++ при работе хранителя в этом режиме не блокируется.

Также нам надо обеспечить наличие единственного модуля. Все необходимые образы не должны загружаться из других файлов, что будет совершенно неудобно для пользователя.

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

Рассмотрение готовой работы, проекта каталога Ех08, начнем с разбора его сердцевины - механизма визуализации жизни подводного мира.

Для хранения образов использую компоненты класса Timage, располагающиеся на форме. Хранитель экрана разместится в единственном файле.

Мне потребовались четыре образа рыбок, один образ всплывающего пузырька воздуха и образ для построения фона (рис. 4.4).

Для загрузки на поверхность образа из компонента класса Timage введена пользовательская функция createFromimage. Рыбки и пузырьки на экране будут иметь случайные размеры, чтобы при использовании цветового ключа не появлялась окантовка. Для корректного масштабирования приходится применять длинную процедуру перекладывания образа на вспомогательные объекты класса TBitMap:

function TfrmDD.CreateFromimage (var FDDS : IDirectDrawSurface7;

const Image : Timage; const imgWidth, imgHeight : Integer) : HRESULT;

var

DC : HDC;

ddsd : TDDSurfaceDesc2;

hRet : HResult;

wrkBitmapl : TBitMap;

wrkBitmap2 : TBitMap;

begin

ZeroMemory (@ddsd, SizeOf(ddsd)); with ddsd do begin

dwSize := SizeOf(ddsd);

dwFlags := DDSD_CAPS or DDSD_HEIGHT or DDSD_WIDTH;

dwWidth := imgWidth;

dwHeight := imgHeight;

ddsCaps.dwCaps := DDSCAPS_OFFSCREENPLAIN;

end;

// Создаем поверхность нужных размеров

hRet := FDD.CreateSurfасе(ddsd, FDDS, nil);

if Failed(hRet) then ErrorOut(hRet, 'Create Surface');

// Первое изображение хранит растр,

// переложенный с компонента класса TImage

wrkBitmapl := TBitMap.Create;

wrkBitmapl.Width := Image.Width;

wrkBitmapl.Height := Image.Height;

// Копирование растра, StretchBlt исказит образ

BitBlt(wrkBitmapl.Canvas.Handle, 0, 0, wrkBitmapl.Width,

wrkBitmapl.Height, Image.Canvas.Handle, 0, 0, SRCCOPY);

// Второе изображение используется для корректного масштабирования

wrkBitmap2 := TBitMap.Create;

wrkBitmap2.Width := imgWidth;

wrkBitmap2.Height := imgHeight;

// Перекладываем растр во второй битмап

wrkBitmap2.Canvas.StretchDraw (Rect (0, 0, imgWidth, imgHeight),

wrkBitmapl);

// Воспроизводим масштабированный растр на сформированной поверхности

if FDDS.GetDC(DC) = DD_OK then begin

BitBlt(DC, 0, 0, imgWidth, imgHeight,

wrkBitmap2.Canvas.Handle, 0, 0, SRCCOPY);

FDDS.ReleaseDC(DC);

end;

wrkBitmapl.Free;

wrkBitmap2.Free;

// Задаем ключ, берем цвет первого пиксела

Result := DDSetColorKey (FDDS, Image.Canvas.Pixels [0, 0]);

end;

Класс TFish инкапсулирует свойства и методы наших рыбок:

TFish = class

XFish, YFish :Integer; // Позиция на экране

Direction :0..1; // Направление движения

WidthFish :Integer; // Ширина

HeightFish :Integer; // Высота

FDDSFish :IDirectDrawSurface7; // Поверхность с образом

SpeedFish :Integer; // Скорость движения

procedure Init; // Инициализация

procedure Render; // Воспроизведение

end;

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных