Быстрое создание ассистента в C++ Builder программе
Сегодня мы рассмотрим, как в рекордно короткий срок можно создать ассистента
у себя в программе при помощи утилит WinRazor SDK.
Все описанное далее применимо в любой IDE, но в данной статье нам придется
также обратить внимание на некоторые особенности Borland C++ Builder. Код этого
примера для C++ Builder 5 UpdatePack1 берем здесь:
http://home.barak-online.net/winrazor/bird.zip
WinRazor SDK берем здесь:
http://home.barak-online.net/winrazor/wr42.zip
Первым делом подготовим все необходимое:
1. Загрузим и проинсталлируем WinRazor SDK.
2. Инсталлируем WinRazor Control (..\Windows\System(32)\winrazor.dll) в C++
Builder.
3. Загружаем пример кода и открываем этот проект в C++ Builder.
4. Подготовим анимационный ролик для ассистента. Тут я предоставляю вам
полную свободу выбора. Можно конечно и самому все нарисовать в графическом
редакторе, но если вам лень этим заниматься, то в Интернете есть полно
анимированных GIF ов. Можно найти подходящий сюжет и разложить его по кадрам.
Если вы имеете TV Tuner , то можно записать подходящий сюжет с какой-либо
передачи. Так, например, ролик предлагаемого вам примера был взят из мультфильма
( программа от TV Tunera AverMedia прекрасно расчленила его на кадры).
5. Открываем редактор. О том, как пользоваться редактором, читайте
здесь: http://home.barak-online.net/winrazor/rus1.zip Также имеется более
полный Help на английском в самом редакторе. Создаем скин для каждого кадра. На
создание каждого скина в самом худшем случае у вас должно уйти от 10 до 15
минут. После создания скинов, по большому счету остается лишь прокручивать их по
таймеру вместе со сменой картинок. А теперь посмотрим, как подключать
WinRazor скины к C++ Builder программе:
После создания нового проекта (по умолчанию), поместите на форму объект Razor
(иконка - ножик) с вкладки ActiveX. Если иконка там не присутствует, значит вы
не проинсталлировали WinRazor Control в вашей IDE - сделайте это. Итак,
единственный объект (кроме самой формы) - это Razor 1. Установим его свойства
в таблице: Interval=100 (запуск таймера), Y_Plus=-5 (регулировка скина на
форме).
Конечно, вы можете воспользоваться в своей программе дополнительными
контролами из VCL (ImageList, Timer, PopUp menu). Это вам решать. В данном
примере я хочу показать, что WinRazor Control справится с поставленной задачей
самостоятельно. Это в свою очередь сэкономит наши ресурсы. Все картинки и скины
мы загрузим в память из файлов в Runtime лишь один раз при загрузке программы.
Поэтому создадим две папки: Images и Skins в директории нашего EXE-файла и
поместим туда все картинки и скины. Данный способ может показаться вам несколько
примитивным, однако он обеспечивает максимальное быстродействие и экономит место
на диске при использовании JPEG файлов.
Итак, рассмотрим сам код:
#include <vcl.h>
#pragma hdrstop
#include "Bird.h"
//--------------------------------------------------------
#pragma package(smart_init)
#pragma link "WINRAZORLib_OCX"
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
wchar_t my_str[16];
int size;
AnsiString str1,str2;
long l,t,w,h;
aot=false;
Razor1->Target_hWnd=(long) Handle;
//--- Захват дескриптора окна формы ----
//--- Загружаем в массивы картинки и скины в одном цикле -
for(int i=0;i<8;i++)
{
str1 = "images\\image" + (AnsiString) i + ".jpg";
str2 = "skins\\skin" + (AnsiString) i + ".wrs";
size = str2.WideCharBufSize();
str2.WideChar( my_str ,size);
pic[i]= new TJPEGImage;
pic[i]->LoadFromFile(str1);
Razor1->Attach_Skin(my_str,i);
}
//----- Создадим PopUp Menu при помощи
//----- функции объекта Razor ------------
str2 ="Minimize"; str2.WideChar( my_str ,size);
Razor1->PopupMenu_Service(0,0,1,my_str);
str2 ="Always on top"; str2.WideChar( my_str ,size);
Razor1->PopupMenu_Service(0,1,1,my_str);
str2 ="Exit"; str2.WideChar( my_str ,size);
Razor1->PopupMenu_Service(0,2,1,my_str);
}
//----------------------------------------------------
__fastcall TForm1::~TForm1(void)
{
//---- Удаляем картинки из памяти ----
for(int i=0;i<8;i++)
delete pic[i];
}
void __fastcall TForm1::FormMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if (Button==0)
{
Razor1->Interval=0;
//---- Остановить Timer при нажатии на
//----- птицу левой кнопкой мыши ----
}
if (Button==1)
{
Razor1->PopupMenu_Show();
//---- Показать PopUp Menu при нажатии на птицу правой
//---- кнопкой мыши ----
}
}
//-------------------------------------------------------
void __fastcall TForm1::FormMouseMove(TObject *Sender,
TShiftState Shift, int X, int Y)
{
if (Shift.Contains(ssLeft))
{
Razor1->LeftButtonMove();
//---- Двигаем птицу -----
Razor1->Interval=100;
//---- Запускаем Timer ----
}
}
//------------------- Применить новый скин и новую
//----- картинку по таймеру ----------
void __fastcall TForm1::Razor1tick(TObject *Sender)
{
static int i=0;
Razor1->Apply_skin(i);
Canvas->Draw(0,0,pic[i]);
i++;
if(i==8) i=0; //--- закольцевать ----
}
//--------------------- On PopUp Menu Click -----------
void __fastcall TForm1::Razor1PopupMenuClick(TObject *Sender,
long button)
{
if (button==0)
{
Application->Minimize();
//--- Минимизировать птицу --------
}
if (button==1)
{
// ----- Переключать "Always on top" mode ON \ OFF --
if(aot==false)
{ Razor1->On_top(1); aot=true;
Razor1->PopupMenu_Service(0,1,6,0);
//--- Check Item ---
}
else
{ Razor1->On_top(0); aot=false;
Razor1->PopupMenu_Service(0,1,7,0);
//--- UnCheck Item ---
}
}
if (button==2)
{
Application->Terminate();
//--- Exit ---
}
}
void __fastcall TForm1::FormMouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if (Button==0)
{
Razor1->Interval=100;
//---- Запускаем Timer ----
}
}
Не так уж много кода, не так ли? Идинственный кусочек дурной работы - это
преобразование строк ( вот работал бы Builder прямо с типом BSTR).
Вам останется только наделить вашего героя нужными функциями, запускаемыми из
Popup Menu. Регулируйте интервал таймера по вкусу.
Как вы могли заметить, WinRazor сделал за вас большую часть работы.