div.main {margin-left: 20pt; margin-right: 20pt}
Быстрое создание ассистента в 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
(..WindowsSystem(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 сделал за вас большую часть работы.
Ну вот и все.
Экспериментируйте и наслаждайтесь.
|