Вход/Регистрация
Графика DirectX в Delphi
вернуться

Краснов Михаил

Шрифт:

Глобальная переменная wrkHandie предназначена для хранения значения дескриптора окна, в котором будет выводиться картинка. Сразу после запуска приложения стартует процедура, определяющая режим работы хранителя:

function TfrmDD.RunScreenSaver : BOOL;

const

SECTION = 'Fish'; // Название секции в реестре

var

S : string;

FIniFile: TReglniFile; // Для работы с реестром

begin

FIniFile := TReglniFile.Create;

// Считываем из реестра записанное значение

Numlmages := FIniFile.Readlnteger(SECTION, 'Numlmages', Maxlmages);

S := ParamStr(l); // Первый параметр при запуске хранителя

if Length(S) > 1 then begin

Delete (S, 1, 1); // Удаляем значок "/" S[l] := UpCase(S[1]); // Переводим в верхний регистр

if S = 'P' then begin // Режим предварительного просмотра

flgWindowed := True; // Задаем оконный режим

// Второй параметр - ссылка на окно предварительного просмотра

wrkHandie := StrToInt(ParamStr(2));

end else

if S[l] = 'C' then begin // Выбран пункт "Настройка"

with TfrmPar.Create (nil) do begin // Выводим окно параметров

tbFish.Max := Maxlmages; // Параметры ползунка

tbFish.Position := Numlmages;

ShowModal;

Numlmages := tbFish.Position; // Выбранное пользователем значение

Free; // Удаляем окно задания параметров хранителя

end;

// Записываем в реестр установленное значение параметра

FIniFile.Writelnteger (SECTION, 'Numlmages', Numlmages);

FIniFile.Free; Result := False;

Exit;

end;

end;

if Assigned (FIniFile) then FIniFile.Free;

Result := True;

end;

После выполнения данной процедуры происходит инициализация DirectDraw. Код этого процесса очень объемный, но нами разобран достаточно хорошо. Здесь устанавливается оконный либо полноэкранный режим. Единственное замечание: в отличие от предыдущих оконных приложений в настоящем примере воспроизведение осуществляется не в собственном окне, поэтому его необходимо скрыть. Сделать это можно разными способами. Я выбрал тот, что основан на использовании региона:

var

Rgn : THandle;

Rgn := CreateRectRgn (О, О, О, О); // Пустой регион

SetWindowRgn(Handle, Rgn, True); // Убираем окно

Осталось последнее, на что следует обратить внимание - фон. Как я уже говорил, он состоит из зацикленных образов, размером 200x200 пикселов. Для оптимизации я не покрываю "паркетной плиткой" экран при каждой перерисовке кадра, а создаю поверхность фона размером 1000x800 пикселов и заполняю ее только один раз, при инициализации. По ходу работы приложения на экран выводятся фрагменты этого фона, размером 640x480 пикселов, и каждый раз происходит небольшой сдвиг координат некоторого фрагмента. Вспомогательный таймер задает величину этого сдвига случайным образом.

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

function TfrmDD.RestoreAll : HRESULT;

var

i : Integer;

hRet : HRESULT;

begin

Result := FDDSPrimary._Restore;

if Succeeded (Result) then begin

if flgWindowed then begin

hRet := FDDSBack._Restore;

if Failed (hRet) then begin

Result := hRet;

Exit;

end;

end;

hRet := FDDSBackGround._Restore;

if Failed (hRet) then begin

Result := hRet;

Exit;

end;

hRet := FDDSImage._Restore;

if Failed (hRet) then begin

Result := hRet;

Exit ;

end;

hRet := CreateFromlmage (FDDSImage, imgBlue, 200, 200);

if Failed (hRet) then begin

Result := hRet;

Exit;

end;

hRet := Prepare; // Заполнение поверхности фона

if Failed (hRet) then begin

Result := hRet;

Exit;

end;

// Восстановление поверхности рыбок

for i := Numlmages - 1 downto 0 do begin

hRet := Fish [i].FDDSFish._Restore;

  • Читать дальше
  • 1
  • ...
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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