в чём написать простой screensaver?

psilocybe

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

lion8

вообще этот скринсейвер есть на маке, но я не нашел ничего под винду
Помнится мне, что некоторые вьюверы могли такое делать (по-моему IrfanView).
А так тебе наверно проще всего на Delphi будет написать. Вот тебе примерчик.
Пишем Screensaver в Delphi
Previous Home Next
Автор: Dave Murray
В примере описывается создание простейшего скринсейвера, а так же его установка и запуск.
Совместимость: Delphi (все версии)
Для написания скринсейвера нам необходимо включить следующие процедуры:
FormShow - скрыть курсор, установка обработки сообщений, начало отображения скринсейвера
FormHide - окончание отображения скринсейвера, отображение курсора
DeactivateScrSaver - обработка сообщений, деактивирование, если нажата мышка или клавиатура
Типичный код для этих процедур показан ниже.
Вы должны быть уверены, что Ваша форма создана со стилем fsStayOnTop. Вы так же должны быть уверены, что только один экземпляр Вашей программы будет запущен в системе. И в заключении Вам необходимо включить директиву компилятора {$D "Programname Screensaver"} в Ваш проект (*.dpr).
После того, как Вы скомпилируете программу, измените расширение файла на SCR и скопируйте его в Вашу системную папку \WINDOWS\SYSTEM .

var
crs : TPoint; {первоначально расположение курсора мышки}

procedure TScrForm.FormShow(Sender: TObject);
{starts the screensaver}
begin
WindowState := wsMaximized; {окошко будет на полный экран}
GetCursorPos(crs); {получаем позицию курсора}
Application.OnMessage := DeactivateScrSaver; {проверяем мышку/клавиатуру}
ShowCursor(false); {скрываем курсор}
{начинаем отображение скринсейвера...}
//
end; {процедура TScrForm.FormShow}

procedure TScrForm.FormHide(Sender: TObject);
{возвращаем управление пользователю}
begin
Application.OnMessage := nil; {запрещаем сообщения}
{останавливаем скринсейвер...}
//
ShowCursor(true); {возвращаем курсор назад}
end; {procedure TScrForm.FormHide}

procedure TScrForm.DeactivateScrSaver(var Msg : TMsg; var Handled : boolean);
{определение движения мышки или нажатия на клавиатуре}
var
done : boolean;
begin
if Msg.message = WM_MOUSEMOVE then {сдвинулась мышка}
done := (Abs(LOWORD(Msg.lParam) - crs.x) > 5) or
(Abs(HIWORD(Msg.lParam) - crs.y) > 5)
else {key / mouse нажаты?}
done := (Msg.message = WM_KEYDOWN) or (Msg.message = WM_KEYUP) or
(Msg.message = WM_SYSKEYDOWN) or (Msg.message = WM_SYSKEYUP) or
(Msg.message = WM_ACTIVATE) or (Msg.message = WM_NCACTIVATE) or
(Msg.message = WM_ACTIVATEAPP) or (Msg.message = WM_LBUTTONDOWN) or
(Msg.message = WM_RBUTTONDOWN) or (Msg.message = WM_MBUTTONDOWN);
if done then
Close;
end; {procedure TScrForm.DeactivateScrSaver}

margadon

думается, это проще было бы готовое найти, чем самому без опыта написать

psilocybe

— не получилось

okis

А на чём тебе бы хотелось его написать?
Такое можно сделать на OpenGL/DirectX на любом языке, в котором есть API для них. Можно взять что-нибудь высокоуровневое вроде WPF, но тогда это будет работать только на машинах с .Net framework 3.0+.

psilocybe

да, я подозревал, что OpenGL понадобится, не знаю на каком. высокоуровневое — да, но всё ж, чтоб результат не потребовал установления доп примочек..

okis

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

margadon

представь, что у тебя где-то далеко-далеко в видеопамяти есть картинка, на ней задана прямоугольная область, растягивающаяся с красивым сглаживанием на весь экран
этот прямоугольник мееееедленно всяко передвигается внутри картинки, соответственно, на экране показываются лишь части этой картинки)
в сущности, сделать такое не очень сложно!
удивительно, что никто до сих пор не сделал :)
Оставить комментарий
Имя или ник:
Комментарий: