BigEdu.ru

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

Главное о чем стоит упомянуть это, что ваш хранитель экрана будет работать в фоновом режиме, и он не должен мешать работе других запущенных программ. Поэтому сам хранитель должен быть как можно меньшего объема. Для уменьшения объема файла в описанной ниже программе не используется визуальные компоненты Delphi, включение хотя бы одного из них приведет к увеличению размера файла свыше 200кб, а так, описанная ниже программа, имеет размер всего 20кб!!!

Технически, хранитель экрана является нормальным EXE файлом (с расширением .SCR), который управляется через командные параметры строки. Например, если пользователь хочет изменить параметры вашего хранителя, Windows выполняет его с параметром "-c" в командной строке. Поэтому начать создание вашего хранителя экрана следует с создания примерно следующей функции:

Procedure RunScreenSaver;

Var S : String;

Begin

S := ParamStr(1);

If (Length(S) > 1) Then Begin

Delete(S,1,1);

{ delete first char - usally "/" or "-" }

S[1] := UpCase(S[1]);

End;

LoadSettings; { load settings from registry }

If (S = 'C') Then RunSettings

Else If (S = 'P') Then RunPreview

Else If (S = 'A') Then RunSetPassword

Else RunFullScreen;

End;

Поскольку нам нужно создавать небольшое окно предварительного просмотра и полноэкранное окно, их лучше объединить, используя единственный класс окна. Следуя правилам хорошего тона, нам также нужно использовать многочисленные нити. Дело в том, что, во-первых, хранитель не должен переставать работать, даже если что-то "тяжелое" случилось, и, во-вторых, нам не нужно использовать таймер.

Процедура для запуска хранителя на полном экране - приблизительно такова:

Procedure RunFullScreen;

Var

R : TRect;

Msg : TMsg;

Dummy : Integer;

Foreground : hWnd;

Begin

IsPreview := False; MoveCounter := 3;

Foreground := GetForegroundWindow;

While (ShowCursor(False) > 0) do ;

GetWindowRect(GetDesktopWindow,R);

CreateScreenSaverWindow(R.Right-R.Left, R.Bottom-R.Top,0);

CreateThread(nil,0,@PreviewThreadProc, nil,0,Dummy);

SystemParametersInfo(spi_ScreenSaverRunning, 1,@Dummy,0);

While GetMessage(Msg,0,0,0) do Begin //отвечаем на сообщения

TranslateMessage(Msg); //что бы не повесить windows

DispatchMessage(Msg);

End;

SystemParametersInfo(spi_ScreenSaverRunning,0,@Dummy,0);

ShowCursor(True);

SetForegroundWindow(Foreground);

End;

Во-первых, мы проинициализировали некоторые глобальные переменные (описанные далее), затем прячем курсор мыши и создаем окно хранителя экрана. Имейте в виду, что важно уведомлять Windows, что это - хранителя экрана через SystemParametersInfo (это выводит из строя Ctrl-Alt-Del чтобы нельзя было вернуться в Windows не введя пароль). Создание окна хранителя:

Function CreateScreenSaverWindow(Width, Height : Integer;ParentWindow : hWnd) : hWnd;

Var WC : TWndClass;

Begin

With WC do Begin

Style := cs_ParentDC;

lpfnWndProc := @PreviewWndProc;

cbClsExtra := 0; cbWndExtra := 0;

hIcon := 0; hCursor := 0;

hbrBackground := 0; lpszMenuName := nil;

lpszClassName:='MyDelphiScreenSaverClass';

hInstance := System.hInstance;

end;

RegisterClass(WC);

If (ParentWindow 0) Then

Result := CreateWindow('MyDelphiScreenSaverClass','MySaver',ws_Child Or ws_Visible or ws_Disabled,0,0,Width,Height,ParentWindow,0,hInstance,nil)

Else Begin

Result := CreateWindow('MyDelphiScreenSaverClass','MySaver',ws_Visible or ws_Popup,0,0,Width,Height,0,0,hInstance,nil);

SetWindowPos(Result,hwnd_TopMost,0,0,0,0,swp_NoMove or swp_NoSize or swp_NoRedraw);

End;

PreviewWindow := Result;

End;

Теперь окна созданы используя вызовы API. Я удалил проверку ошибки, но обычно все проходит хорошо, особенно в этом типе приложения.

Теперь Вы можете погадать, как мы получим handle родительского окна предварительного просмотра ? В действительности, это совсем просто: Windows просто передает handle в командной строке, когда это нужно. Таким образом:

Procedure RunPreview;

Var

R : TRect;

PreviewWindow : hWnd;

Msg : TMsg;

Dummy : Integer;

Begin

IsPreview := True;

PreviewWindow := StrToInt(ParamStr(2));

GetWindowRect(PreviewWindow,R);

CreateScreenSaverWindow(R.Right-R.Left,R.Bottom-R.Top,PreviewWindow);

CreateThread(nil,0,@PreviewThreadProc,nil,0,Dummy);

While GetMessage(Msg,0,0,0) do Begin

TranslateMessage(Msg);

DispatchMessage(Msg);

End;

End;

Как Вы видите, window handle является вторым параметром (после "-p").

Чтобы "выполнять" хранителя экрана - нам нужна нить. Это создается с вышеуказанным CreateThread. Процедура нити выглядит примерно так:

Function PreviewThreadProc(Data:Integer) : Integer; StdCall;

Var R : TRect;

Begin

Result := 0; Randomize;

GetWindowRect(PreviewWindow,R);

MaxX := R.Right-R.Left;

MaxY := R.Bottom-R.Top;

ShowWindow(PreviewWindow,sw_Show);

UpdateWindow(PreviewWindow);

Repeat

InvalidateRect(Pre

Внимание, отключите Adblock

Вы посетили наш сайт со включенным блокировщиком рекламы!
Ссылка для скачивания станет доступной сразу после отключения Adblock!

Скачать
Рефераты по информатике и программированию Главное о чем стоит упомянуть это, что ваш хранитель экрана будет работать в фоновом режиме, и он не должен мешать работе других запущенных программ.
Оценок: 1005 (Средняя 5 из 5)

Наверняка у вас есть товары или услуги, продажа которых приносит вам максимальную прибыль. Для быстрого старта в сети вам необходимо создание посадочной страницы (одностраничного сайта), на которой будет размещена информация о маржинальных товарах/услугах интернет магазина. За 8 лет опыта разработки конверсионных страниц мы выработали оптимальную структуру, которая позволит привлекать через landing page больше продаж. На такую структуру «одевается» ваш контент — фирменный стиль, тексты, фотографии, уникальные торговые предложения, после чего страница выходит в свет. Разработка лендинга и запуск в сети — до 7 рабочих дней. Стоит отметить, что в разработку самой посадочной страницы входит и написание копирайтером продающих текстов для вашего бизнеса, чтобы каждый посетитель страницы захотел совершить покупку именно у вас. Результат: качественно разработаная продающая посадочная страница, которая готова приносить вам новых клиентов.

© 2016 - 2022 BigEdu.ru