Здравствуйте, в этом уроке я хочу рассказать, как создать динамические флэш-обои. Многие из вас видели в Winamp`е, как картинка на рабочем столе, заменялась на красивые эффекты.
Вспомнили? Для того, чтобы создать самому такое, нам потребуется Borland Delphi 7, Flash любой версии и немного терпения. В прикрепленном архиве есть необходимые библиотеки. | Итак, приступим... Создадим новую папку. Назовем ее FlashDeskTop, скопируем туда папку LIBS из архива, и файлы DX_Utils.pas, DXOverlay_unit.pas, EffectSource_unit.pas, EffectSource_unit.dcu, DXOverlay_unit.dcu, DX_Utils.dcu.
Еще создадим простой рисунок fdtop.bmp (внимание — 24-битный), для нормальной работы приложения.
Откроем программу Delphi 7. Если у вас не установлен флэш-компонент в Делфи, то установим новый компонент ActiveX, для этого выберем меню Component -> Import ActiveX Control. Появится окно… | | Нажмем кнопку Add, выбираем и устанавливаем файл FlDbg9c.ocx из архива. | Далее создадим новый проект: | Сразу сохраним все: форму я сохранил как mainForm.pas, сам проект как flash.dpr.
Затем установим директорию для наших дополнительных файлов: | Выберем вкладку Dirictories/Conditionals и в поле Search Path напишем libs. | Приступим к написанию кода, откроем панель кода mainForm, в строке usage напишем необходимые библиотеки, это будет выглядеть так:
unit mainForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs,
ShockwaveFlashObjects_TLB, ExtCtrls, DXOverlay_unit, OleCtrls, Menus, ComCtrls,
StdCtrls, Buttons;
| Добавим компонент OpenDialog, для этого выберем его из вкладки Dialogs: | Затем установим его на нашей форме: | Также вставим компонент таймера (Timer) из вкладки System.
Далее там, где у нас прописался OpenDialog1, в строке type допишем еще пару компонентов, получится вот так:
unit viewForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms, Dialogs, ShockwaveFlashObjects_TLB, ExtCtrls, DXOverlay_unit,
OleCtrls, Menus, ComCtrls, optionForm, StdCtrls, Buttons;
type
TForm1 = class(TForm)
DXOverlay: TDXOverlay;
Timer1: TTimer;
Flash1: TShockwaveFlash;
OpenDialog1: TOpenDialog; | Объявим новые переменные:
var
Form1: TForm1;
bPlay: Boolean=False;
Flash1: TShockwaveFlash;
myTemp, myFlash: TBitmap;
f1Width, f1Height: Integer;
cpRect: TRect; | Идем дальше, добавим события для формы. Для этого выберем нашу форму Form1 в окне Object TreeView и вкладку Event в панели Object Inspector. Двойным щелчком в поле OnCreate мы создадим новую процедуру. | И в этой процедуре напишем код:
procedure TForm1.FormCreate(Sender: TObject);
begin
myFlash:=TBitmap.Create;
myTemp:=TBitmap.Create;
myFlash.LoadFromFile('fdtop.bmp');
Flash1.Free;
Flash1:=TShockwaveFlash.Create(Form1);
Flash1.Parent:=Form1;
Flash1.Width:=1000;
Flash1.Height:=1000;
Flash1.Top:=1000;
Flash1.Left:=1000;
end; | Таким же способом создадим процедуру OnPaint:
procedure TForm1.FormPaint(Sender: TObject);
begin
Flash1.Movie := 'c:\fd\chgPic.swf'; //укажем путь к начальному флэш клипу
DXOverlay:=TDXOverlay.Create(f1Width, f1Width, True);
DXOverlay.SetOverlayCKey($ffffffff, True);
f1Width:=1000;
f1Height:=f1Width;
myTemp.Width:=f1Width;
myTemp.Height:=f1Width;
myFlash.Width:=f1Width;
myFlash.Height:=f1Height;
myFlash.Canvas.Rectangle(0,0,f1Width,f1Height);
Form1.Hide;
Flash1.Visible:=False;
Flash1.Enabled:=False;
Timer1.Interval := 10; //интервал прорисовки экрана
Timer1.Enabled:=True;//запускаем наш таймер
end; | Выберем теперь Timer1, во вкладке Properties укажем свойство Enabled как False, чтобы он не начал сразу исполнять нашу функцию.
Затем во вкладке Events, опять же дважды щелкнем в поле OnTimer и создадим новую процедуру:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Flash1.PaintTo(myTemp.Canvas, 0, 0);
//копируем содержимое флэш компонента в Bitmap
cpRect:=Bounds(0,0, f1Width, f1Height);
myFlash.Canvas.CopyRect(cpRect, myTemp.Canvas, cpRect);
DXOverlay.DrawImage(myFlash.ScanLine[0], f1Width*-3, nil);
//затем прорисовываем полученную картинку на экран.
end; | Теперь откроем код нашего проекта: | И в нем напишем такой код:
program flash;
uses
Forms,
winstuff_light,
Messages,
SysUtils,
Variants,
Classes,
Graphics,
Controls,
Dialogs,
ShockwaveFlashObjects_TLB,
mainForm in 'mainForm.pas' {Form1};
{$R flash.res} //Указаваем имя файла со значком
var Handle: THandle;
myColor: TColorDialog;
Flash1: TShockwaveFlash;
myFile: String='';
procedure Mproc(ItemIndex: Integer);
begin
//здесь в зависимости от выбора меню выполняем процедуры
case ItemIndex of
0: begin
Form1.OpenDialog1.Execute;
myFile:=Form1.OpenDialog1.FileName;
Form1.Flash1.Movie:=myFile;
end;
2: begin
myColor.Execute;
Form1.Flash1.BackgroundColor:=myColor.Color;
end;
4: begin
Form1.DXOverlay.Free;
Form1.Close;
end;
end;
end;
begin
myColor:=TColorDialog.Create(nil);
Handle:=CreateWindow('');
AddTrayIcon(Handle,'MNIcon','Flash DeskTop',
['Открыть файл','-','Выбрать фон','-','Exit'], Mproc);
//Добавляем значок в панель задач
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Form1.Hide;
Application.Run;
DeleteTrayIcon;
end. | Далее нарисуем значок для панели задач, для этого откроем меню Tools, и щелкнем на Image Editor.
Откроется окно редактора изображений, создадим новый файл ресурса с расширением .res. | Затем появится новое меню Resource, щелкнем на него, выберем New Icon. Дальше появится окно с опциями, оставим все как есть — 32х32 16 colors.
Нарисуем значок для панели задач. Переименуем получившийся значок в MNICON, и сохраним наш файл как flash.res, в папке с проектом.
Должно получится, примерно так: | Сделаем небольшую флэш-анимацию для проверки нашей программы. Не забудьте прописать путь к flash-ролику. Во всяком случае, можно будет открыть другой документ. В архиве есть некоторые флэш-ролики для демонстрации.
Создадим анимацию с картинками, сначала будет видна одна картинка, она будет плавно исчезать, и за ней будет появляться другая. Я делал это во Flash СS3, но для этой флэш-презентации подойдет и 7-я версия программы.
Итак, запустим программу для создания flash-анимации, создадим новый файл ActionScript 2.0, в первом кадре напишем такой код:
picture1=true;
picture2=false;
TimeInterval=1000;
TimeChange=false;
myTime=2000;
attachMovie("pic"+Math.round(Math.random()*8+1), "pict1", 1);
//Здесь у меня число 8 – это количество клипов с картинками.
pict1._height=550;
pict1._x=275;
pict1._y=200;
attachMovie("pic"+Math.round(Math.random()*8+1), "pict2",0);
pict2._height=550;
pict2._x=275;
pict2._y=200;
stop();
onEnterFrame=function()
{
if(myTime<getTimer()){
if(picture1){
pict1._alpha--;
if(pict1._alpha<0){
pict2.swapDepths(1);
attachMovie("pic"+Math.round(Math.random()*8+1), "pict1", 0);
pict1._height=550;
pict1._x=275;
pict1._y=200;
TimeChange=true;
picture1=false;
picture2=true;
}
}
if(picture2){
pict2._alpha--;
if(pict2._alpha<0){
myTime=10000+getTimer();
pict1.swapDepths(1);
attachMovie("pic"+Math.round(Math.random()*8+1), "pict2", 0);
pict2._height=550;
pict2._x=275;
pict2._y=200;
TimeChange=true;
picture2=false;
picture1=true;
}
}
if(TimeChange) TimeInterval=5000;
myTime=TimeInterval+getTimer();
TimeInterval=1000;
TimeChange=false;
}
} | Далее создадим MovieClip, в которых будут картинки. Самое главное называть их pic1, pic2, pic3 и так далее.
И не забудьте поставить галочку Export for ActionScript: | Экспортируем в библиотеку картинки, и вставим их в наши MovieClip.
У меня 8 картинок, и в коде я указал это число:
attachMovie("pic"+Math.round(Math.random()*8+1), "pict1", 1);
pict1._height=550;
pict1._x=275;
pict1._y=200;
attachMovie("pic"+Math.round(Math.random()*8+1), "pict2",0); | Ну вот и все!.. Протестируем наш клип — все должно работать.
В архиве есть исходник, но для уменьшения размера, я удалил картинки.
Всем удачи! |