Подражаем Office 2007. Свой mini-bar

altНе успели многие начинающие пользователи компьютера закончить разного рода курсы по освоению всемирно известного офисного пакета MS Office 2003, как «злые» программисты компании Microsoft написали новую версию MS Office 2007, в которой интерфейс был кардинально. Что же принес нам новый дизайн? Многие офисные работники, увидев новый вид программного продукта, побежали от ужаса в ближайшую аптеку за корвалолом. Неужели все так страшно?

После подробного знакомства с приложением, оказалось, что не такой уж он и страшный. Много очень удобных нововведений, которые значительно ускоряют написание документов. Одним из таких, на мой взгляд, приятных новшеств является MS Office Mini-bar.


На мой взгляд, очень удобный инструмент — где ни кликни мышкой, появляется панель, с возможными вариантами действий над выбранным объектом, будь это таблица, рисунок, диаграмма или просто текст.

А почему бы не сделать Мини-бар для своей программы? Чем мы хуже Microsoft’а (ничем, просто у нас нет столько денег – прим. редактора)? Тем более сделать это, с технической точки зрения, вовсе не сложно. Я провел все необходимые исследования и выяснил все тонкости mini-bar строения.

Для созданий своего мини-бара нам понадобится немного:

1. Базовые знания Delphi
2. Голова на плечах
3. Руки (прямые)
4. И немного старания.

Приступаем

Перво-наперво создадим проект нашей новой программы (File-New-Application)! Мини-бар в нашем случае будет обычная форма, связанна с главной формой и выполняющая в ней разного рода действия. Пользоваться придется им часто, поэтому для простоты обращения создадим процедуру, под названием Minibar. После слов


{$R *.dfm}

Объявим процедуру:


procedure TForm1.Minibar (forma:tform; prozr:boolean; timer_p:ttimer; obr:byte);

Она принимает четыре параметра:

Forma – переменная типа tForm, которая будет служить для нас шаблоном формы. Какую форму мы укажем, та и появится в качестве мини-бара.

Prozr – переменная типа Boolean. Данная переменная будет включать или выключать плавное появление или исчезновение формы. Вы спросите, зачем этот параметр? Если вы будете писать большой проект, то возможно он у вас будет забирать много системных ресурсов, что может привести к «торможению» компьютера и было бы не плохо заранее продумать возможность отключения визуальных эффектов.

Timer_p – переменная типа tTimer. Она указывает на таймер, отслеживающий положение курсора. В зависимости от отдаления курсора мыши от нашего МБ, окошко будет плавно затухать и наоборот, по приближению появляется.

Obr – переменная типа byte. В нашей процедуре используется в качестве параметра для обращения к функции. В моем случае, функция определяет два параметра:

0 – Создание и обработка формы Мини-бара.
1 – Параметр для обращения таймера к функции. С помощью этого параметра осуществляется обработка появления и затухания формы.

Пришло время подробней рассмотреть процедуру Minibar. Начнем с параметра – 0. Создадим условие для переменной obr. Для этого напишем три, простые строчки:


case obr of
0:
Begin

Для того, чтобы М-Б, появлялся именно в том месте, где мы нажали мышкой, нам требуется записать координаты положения курсора. Их будем записывать в переменную типа tPoint. Назовем её «pos», в разделе описания переменных Var объявим переменную

var
pos : tpoint;

И перепишем следующий код:

case obr of
0:
begin
pos:=mouse.CursorPos; // переменной pos присваиваем координаты позиции курсора
forma.Show; // Активируем Мини-бар
forma.Left:=pos.X; // Отступ слева делаем по значению X
forma.Top:=pos.Y-forma.ClientHeight; // Отступ сверху делаем по значению У и отнимаем
// рабочую высоту формы, чтобы нижний правый край формы был рядом с положением курсора
if prozr=true then // если параметр прозрачности равен – истина, тогда
begin
forma.AlphaBlend:=true; // включаем параметр прозрачности формы
timer_p.Enabled:=true; // активируем таймер
timer_p.Interval:=1; // для плавности ставим интервал таймера 1 миллисекунду
end
else // если параметр прозрачности не равен истине, значит
timer_p.Enabled:=false; // не активируем таймер
end;

[code=delphi]
Теперь поглядим на обработку обращения таймера. Для работы с таймером придется объявить несколько новых переменных:
[code=delphi]

const
dl = 100; // переменная определяет расстояние от мини-бара, при котором прозрачность будет равна нулю
var
i, ip : integer;
pr,lv,vr,nz,vn:boolean; // pr – справа, lv – слева, vr – сверху, nz – снизу, vn – внутри.

Переходим к коду:


1:
// Для дальнейшей работы нам надо отследить где по отношению к мини-бару находится курсор
// всем переменным присваиваем значение — ложь
Begin
pr:=false;
lv:=false;
vr:=false;
nz:=false;
vn:=false;
// считываем положение курсора
pos:=mouse.CursorPos;
// если курсор находится левее чем мини-бар, тогда всем значениям кроме lv присваем ложь,
if pos.X pr:=false;
lv:=true;
vr:=false;
nz:=false;
vn:=false;
end;
// если курсор находится левее чем мини-бар, тогда всем значениям кроме pr присваем ложь,
if pos.X>forma.Left+forma.ClientWidth then
begin
pr:=true;
lv:=false;
vr:=false;
nz:=false;
vn:=false;
end;
// если курсор находится левее чем мини-бар, тогда всем значениям кроме vr присваем ложь,
if pos.Y pr:=false;
lv:=false;
vr:=true;
nz:=false;
vn:=false;
end;
// если курсор находится левее чем мини-бар, тогда всем значениям кроме nz присваем ложь,
if (pos.Y>forma.Top+forma.ClientHeight) then
begin
pr:=false;
lv:=false;
vr:=false;
nz:=true;
vn:=false;
end;
// если курсор находится левее чем мини-бар, тогда всем значениям кроме vn присваем ложь,
if (pos.yforma.Top) and (pos.Xforma.Left) then
begin
pr:=false;
lv:=false;
vr:=false;
nz:=false;
vn:=true;
end;
// движение курсора слева. Отслеживаем на сколько курсор левее нашего компонента
if (pos.Xforma.Left-dl+5)
and (lv=true) then
begin
// в зависимости от расстояния между курсором и Мини-баром делаем форму прозрачной
ip:=255-(forma.Left-pos.X)*(round(255/dl));
// вычисляем нужную прозрачность
// если прозрачность больше либо равна нулю, тогда…
if ip>=0 then
forma.AlphaBlendValue:=ip;
// если прозрачность формы от нуля до пяти, значит можно её закрыть
if (forma.AlphaBlendValue=0) or
(forma.AlphaBlendValue<5) then forma.close;
end;
// движение курсора справа
if (pos.X>(forma.Left+forma.Width)) and
((pos.X<(forma.Left+forma.Width+dl-5))) and (pr=true) then
begin
ip:=(forma.Left+forma.ClientWidth-pos.X)*(round(255/dl));
if ip<0 then
ip:=255-ip*(-1);
// если прозрачность меньше нуля, тогда умнажаем на -1, чтобы поменять знак
if ip>=0 then
forma.AlphaBlendValue:=ip;
if (forma.AlphaBlendValue=0) or (forma.AlphaBlendValue<5) then forma.close;
end;
// движение курсора сверху
if (pos.Y(forma.Top-dl+3)) and (vr=true) then
begin
ip:=255-(forma.Top-pos.y)*(round(255/dl));
if ip>=0 then
forma.AlphaBlendValue:=ip;
if (forma.AlphaBlendValue=0) or
(forma.AlphaBlendValue<5) then forma.close;
end;
// движение курсора снизу
if (pos.Y>forma.top+forma.ClientHeight) and
(pos.Y>(forma.Top+forma.ClientHeight-dl+3)) and (nz=true) then
begin
ip:=(forma.Top+forma.ClientHeight-pos.y)*(round(255/dl));
if ip<0 then
ip:=255-ip*(-1);
if ip>=0 then
forma.AlphaBlendValue:=ip+255;
if (forma.AlphaBlendValue=0) or (forma.AlphaBlendValue<5) then forma.close;
end;
// Для того, чтобы Мини-бар был полностью непрозрачным,
// обрабатываем случай, когда курсор расположен над мини-баром
if (pos.X>forma.Left) and (pos.Xforma.Top) and (pos.Y forma.AlphaBlendValue:=255;
end;
button1.Caption:=inttostr(ip);
end;
end;
Теперь приступим к созданию самого Мини-бара! Создаем новую форму, Нажимаем Alt+F11, связываем её с формой Form1. Такое же действие проделываем и с главной формой, связывая, её с формой Мини-бара.

При создании мини-бара я использовал библиотеку Alpha Control, благодаря ней, у меня получился примерно такой вот Мини-бар.


При создании Мини-бара рекомендую следовать следующим пунктам:
1. Мини-бар следует делать как можно компактней, так, чтобы он как можно меньше пространства занимал на экране.

2. При использовании выпадающих списков, вам следует отключать таймер, так как если высота списка больше 100, то форма будет закрываться.

3. Все компоненты рекомендуется отодвинуть от краев формы примерно на 3-5 пикселей, благодаря этой операции, при появлении Мини-бара он будет отличаться от формы.

Мини-бар мы создали, теперь давайте разберемся, как его вызывать. В обработчике нужного вам события впишите следующую строчку.


minibar(form2,true,timer1,0);

Добавьте на форму таймер и сделайте его не активным. В обработчике OnTimer пишем:


procedure TForm1.Timer1Timer(Sender: TObject);
begin
minibar(form2,true,timer1,1);
end;

Ну, вот наш пример Мини-бара готов! Результат работы моего примера представлен на рисунке ниже. Надеюсь, эта статья окажется для вас полезной! Удачного кодинга!

Понравилась статья? Поделиться с друзьями: