Главная » 2D графика » Профессиональное создание хранителей экрана

RSS

Профессиональное создание хранителей экрана

Не нравитсяНравится   Рейтинг +2

Создание хранителей экрана

Мы динамически загружаем (недокументированную) библиотеку MPR.DLL, которая имеет функцию, чтобы установить пароль хранителя экрана, так что нам не нужно беспокоиться об этом.
TPCPAFund ОПРЕДЕЛЕН как:

1
Type TPCPAFunc = Function(A : PChar; Parent : hWnd; B,C : Integer) : Integer; StdCall;

Теперь единственная вещь, которую нам нужно рассмотреть, – самая странная часть: создание графики. Я не великий ГУРУ графики, так что Вы не увидите затеняющие многоугольники, вращающиеся в реальном времени. Я только сделал некоторые ящики.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Procedure DrawSingleBox;
Var
  PaintDC : hDC;
  Info : TPaintStruct;
  OldBrush : hBrush;
  X, Y : Integer;
  Color : LongInt;
Begin
  PaintDC := BeginPaint(PreviewWindow, Info);
  X := Random(MaxX);
  Y := Random(MaxY);
  If SolidColors Then
    Color := GetNearestColor(PaintDC, RGB(Random(255), Random(255), Random(255)))
  Else Color := RGB(Random(255), Random(255), Random(255));
OldBrush := SelectObject(PaintDC, CreateSolidBrush(Color));
  If RoundedRectangles Then RoundRect(PaintDC, X, Y, X + Random(MaxX - X), Y + Random(MaxY - Y), 20, 20)
  Else Rectangle(PaintDC, X, Y, X + Random(MaxX - X), Y + Random(MaxY - Y));
  DeleteObject(SelectObject(PaintDC, OldBrush));
  EndPaint(PreviewWindow, Info);
End;

И последнее – глобальные переменные:

1
2
3
4
5
6
7
8
RoundedRectangles : Boolean;
SolidColors : Boolean;
IsPreview : Boolean;
MoveCounter : Integer;
QuitSaver : Boolean;
PreviewWindow : hWnd;
MaxX, MaxY : Integer;
Command : Char;

Ох, чуть не забыл! Если, Вы используете SysUtils в вашем проекте (например функцию StrToInt) вы получите EXE-файл больше чем обещанный в 20 kб. Если Вы хотите все же иметь 20 kб, надо как-то обойтись без SysUtils, например самому написать собственную StrToInt процедуру.

Если все же очень трудно обойтись без использования Delphi-форм, то можно поступить как в случае с вводом пароля: форму изменения параметров хранителя сохранить в виде DLL и динамически ее загружать при необходимости. То есть будет маленький и шустрый файл самого хранителя экрана и довеска DLL для конфигурирования и прочего (там объем и скорость уже не критичны).

Вот на этом месте оригинальная статья «Screen Saver in Win95″ или «Создание хранителя экрана (ScreenSaver)» заканчивалась … далее пойдут мои комментарии и размышления.

В оригинальных статьях было такое количество ошибок, начиная от простых грамматических, потом шли не точности перевода ( например потоки Thread переводились как нити ) и заканчивалось все ГРУБЕЙШИМИ ошибками в коде. Последнее наиболее критично, т.к. по такой статье не возможно было составить работающий проект. Естественно «авторы» перевода не исправили эти ошибки ( или, что наиболее вероятно, не смоги их понять ), что и привело к невозможности компиляции примера. Внешне статья выглядела просто прекрасно, и ее широко распространили русскоязычные сайты.

Итак, я довел пример до ума, создал рабочую версию примера, несколько отредактировав исходный код. В результате Вы получите прекрасный шаблон для создания собственных Screen Saver’ов.

Много комментариев я добавил в исходный код, а наиболее критичные на мой взгляд вещи объясню ниже.

Первый момент, на котором я бы хотел остановится это отладка приложения. Как Вы уже поняли, Screen Saver ведет себя по разному в зависимости от различных параметров запуска. Итак, как нам эмулировать запуск его с разными параметрами в среде Delphi? Да очень просто: меню «Run –> Parametrs –> закладка Local –> строка Parametrs». Например чтобы запустить Screen Saver в режиме настройки, нужно вписать параметр «c» и так далее. Для отладки режима PreView передавайте параметр «p 0″.

Теперь перейдем к созданию ресурсов. Как было описано выше, для его создания использовался Borland Resource Workshop 4.5. Это достаточно старый продукт, по этому в его роботе есть несколько тонкостей. Самое главное, при создании ресурса выберите «File –> Preferences –> Target Windows Version –> Win32″. Далее необходимо использовать только стандартные ресурсы, для этого отключите флажок «Options –> Preferences –> Generate CONTROL statements only». При включении этого флага, в файл RC будет записываться примерно такие строки:

CONTROL «Check», 10, «BorCheck», 3 …

Компиляции ресурса пройдет нормально, но при вызове диалога результат всегда будет равен -1 ! Это происходит по тому, что данный ресурс не является стандартным Windows. Для его работы необходима библиотека Borland ( я точно не знаю какая). Я установил это следующим образом: если загружен Resource Workshop диалог показывается нормально, при его отсутствие выдается сообщение о ошибке. Т.е. нужно использовать только те стандартные контролы, которые описаны в справке Windows SDK (LTEXT, RTEXT, COMBOBOX и т.д.). Справку об этих элементах можно получить в разделе меню «Help –> Windows SDK», например выбрав указатель LTEXT.

Страницы : 1 2 3 4 5

Таги: ,