Как подобрать обои на Рабочий стол? Предлагаю использовать все по очереди! Попробуем создать программу для смены обоев на Рабочем столе через заданный интервал времени. Отличие программы от всех подобных в том, что в ней не будет лишних никому не нужных функций, а значит, она будет меньше загружать оперативную память компьютера и мысли пользователя.
Пример выполнен на Delphi 7 и ориентирован на неопытного кодера, поэтому постараюсь описать все очень подробно и доступно. Тем не менее, пример будет отлично работать и в предыдущих версиях.
С чего начнем? Конечно же, с формы приложения. Итак, создаем VCL Forms Application. Посмотрим, какие компоненты нам необходимы. Вкладка палитры компонентов Standart - берем Label, для отображения пути к выбранному файлу; Panel - чисто декоративно, как использовать и сколько надо, не буду комментировать, можно вообще не использовать. Вкладка Additional - Bitbtn - берем две кнопки (старт/стоп); Image - для предварительного просмотра выбранного файла. Вкладка System - здесь нам нужен только Timer, для периодичности смены картинки. Для того, чтобы задавать интервал смены картинки для нашего таймера, возьмем с вкладки Samples компонент SpinEdit. Для полного удобства выбора пути к файлу с вкладки Win 3.11 берем DriveComboBox, DirectoryListBox, FileListBox. Назначение этих компонентов понятно из их названия.
Я не могу ограничить вас в оформлении приложения, поэтому перенесите все необходимые компоненты на форму и разместите их так, как сами считаете нужным. Я сделал это так, как показано на рисунке.
Маленькое отступление
Это отступление только для юных кодеров, чтобы скрасить понимание. Компонентом можно манипулировать в инспекторе объектов (он находится снизу слева), который имеет две вкладки: properties и events. В properties мы можем изменить параметры, которые касаются оформления компонента, в events хранятся процедуры действия компонента. Поэтому если я говорю про значения свойств компонента, я имею в виду вкладку properties, а если про действия - ищите их на вкладке events. Для перехода от дизайнера формы к коду формы и наоборот используется клавиша F12. Названия всех компонентов я оставляю стандартными, чтобы потом ни у кого не возникло недоразумений с названиями.
Надстройки формы
У нас есть уже заготовка, теперь посмотрим, что с этим всем делать. Для формы Form1 в инспекторе объектов меняем такие параметры: caption - пишем название приложения, borderIcons->biMaximize - false, borderStyle - bsSingle, position - poScreenCenter. Теперь форма нашего приложения будет всегда располагаться по центру экрана и не будет иметь возможности максимизироваться, так как это сможет привести к некорректному отображению элементов в нашей программе. Иными словами, делаем так называемую «защиту от дураков» (fool protection).
DriveComboBox - в свойствах меняем параметр DirList (там только одно значение, ошибиться невозможно), соответственно связываем этот объект с DirectoryListBox. Теперь при смене диска в DriveComboBox меняется содержимое DirectoryListBox.
Идем дальше и для DirectoryListBox меняем свойства FileList и DirLabel - тут все и так понятно, если посмотреть на результат.
FileListBox - свойство MASK пишем *.jpg - это чтобы мы смогли смотреть только на картинки jpg и не видеть остальное.
Для того, чтобы наша картинка красиво отображалась пропорционально и по центру, у компоненты Image1 меняем свойства Center, Proportional в TRUE.
В принципе, все необходимое вроде сделано. Другими настройками не буду увлекаться, я думаю, каждый сможет раскрасить свое приложение по собственному усмотрению. Если что-то не получилось, возвращатесь в начало, а если все нормально, то следуте за мной дальше.
Кодинг
Жмем клавишу F12 и в листинге формы в разделе Uses добавляем модули ComObj, ShlObj. Jpeg. Для FileListBox в инспекторе объектов на вкладке events для события OnClick пишем две строчки:
Label1.Caption:=FileListBox1.Filename;
Image1.Picture.LoadFromFile(Label1.Caption);
Первая строка хранит имя и путь к выбранному файлу-картинке. Вторая строка будет отображать картинку на элементе Image1. Теперь мы располагаем готовым приложением для просмотра картинок! Но у нас есть еще другая цель, поэтому идем дальше и в коде программы после слов implementation {$R *.dfm} пишем следующую процедуру:
Procedure Change;
const
Desktop: TGuid='{75048700-EF1F-11D0-9888-006097DEACF9}'; //для получения доступа к рабочему столу
var
ActiveDeskTop:IActiveDesktop; // вроде понятно, зачем
begin
ActiveDesktop:=CreateComObject(Desktop) as IActiveDesktop; //создаем объект и получаем разрешение доступа к рабочему столу
ActiveDesktop.SetWallpaper(StringToOleStr(form1.Label1.Caption), 0); // определились с выбором картинки
ActiveDesktop.ApplyChanges(AD_APPLY_ALL); // применяем картинку на рабочем столе
end;
Есть, конечно, и другие способы менять обои, но преимущество нашей процедуры в том, что она работает под WindowsXP. Я думаю, комментарии написаны понятно. Во всяком случае, для начала хватит с головой. А хитрость в том, что мы работаем с реестром Windows и {75048700-EF1F-11D0-9888-006097DEACF9} - это реальный адрес в реестре, в котором есть параметр ActiveDesktop. Если не верите, можете проверить.
Что бы наша программа могла работать с картинками, логично будет сначала посмотреть, есть ли картинки в выбранной папке, и определить их количество. Поэтому нам надо создать числовую переменную i, которая будет выступать у нас в качестве счетчика картинок. В разделе var нашего приложения дописываем:
i:integer;
Для формы form1 в events -> OnCreate пишем i:=0; - при запуске программе обнуляем счетчик.
Переходим к таймеру - свойство enabled ставим в false, interval - 1000 и в действии OnTimer пишем:
i:=i+1; //переходим к следующей картинке
if i=form1.FileListBox1.Items.Capacity // если наш счетчик дошел до конца списка, идем в начало
then i:=0;
label1.caption:=form1.FileListBox1.Items[i]; //все понятно
change; //меняем обои
Дважды щелкните по кнопке BitBtn1 и впишите следующую строку:
timer1.enabled:=true;
В свойстве Caption назовем ее Start, другую назовем Stop и для нее напишем
timer1.enabled:=false;
И еще пара доработок: у счетчика spinedit свойству increment присвоим значение 1000 (а чего мелочиться?), и на событие OnChange напишем следующее
timer1.Interval:=spinedit1.Value;
От греха подальше уберем поначалу кнопку Start - в свойстве кнопки enabled->false. А разрешим ее только тогда, когда выберем картинку, то есть кликнем по FileListBox1. Допишем в событие OnClick:
BitBtn1.Enabled:=true;
Если мы заходим перейти в другую папку, то логично будет отключить таймер и запретить кнопку Start. Для этого в DirListBox1 в событие OnClick пишем такие строки:
timer1.Enabled:=false; BitBtn1.Enabled:=false;
Красота… да, но еще надо поработать. Надо убрать наше приложение с панели задач, дабы оно не раздражало наш зоркий глаз и не портило нам зрение. Спрячем нашу программу в трей. Но про это мы поговорим в следующий раз. А пока смело жмем F9 и наслаждаемся проделанной работой.