API. Анимация в трее 
raxp@mail.zp.ua
Попался мне как- то драйвер от одной мыши. И в трее скоро зажил зверек, следящий
за любыми перемещениями. Как бы нам такое?
Краткий экскурс...
Конечно, можно взять готовый компонент, создать в любом редакторе набор картинок,
напихать иконок и показывать в определенной последовательности…

Этот метод хорош для быстрой разработки, но динамическую индикацию можно осуществить
и по другому… Как? На API
Решение
Создание формы на WinAPI опускаем - это не наша
цель, при желании все же взглянуть пожалуйте сюда
http://ra-xp.narod.ru/zip/fap.zip
Можно нарисовать bitmap-ы (AndMask, XOrMask), а потом воспользоваться
свойствами маски иконки и поместить на нее наши картинки… следует учесть, что
размер bitmap не должен превышать 32x32 pix.
Icon:= TIcon.Create;
IconInfo.fIcon := true;
IconInfo.hbmMask := AndMask.Handle;
IconInfo.hbmColor:= XOrMask.Handle;
Icon.Handle:= CreateIconIndirect(IconInfo);
AndMask.Free;
Как же отследить перемещения мыши и получить угловые координаты? Координаты
получить легко, функция getcursorpos(t). А угол наклона?
Вспомним школьную программу - теорему синусов и Пифагора:
Если w, h – ширина, высота экрана в пикселах, то стороны нашего треугольника
a:= h - t.Y;
b:= w - t.X;
c:= sqrt((a*a)+(b*b));
а угол соответственно
ug:= trunc(180*ArcSin(a/c)/pi);
дальше проще, раз мы можем рисовать на bitmap-е, то можем и реализовать что-то
вроде ИКО (индикатора кругового обзора), указывающий на нашу мышку:
x:= 16+trunc(16*sin((ug+270)*pi/180));
y:= 16-trunc(16*cos((ug+270)*pi/180));
XOrMask.Canvas.MoveTo(16,16); //ИКО
XOrMask.Canvas.LineTo(x, y);
и собственно, то ради чего это задумывалось:
//простейший алгоритм анимации-
if (20>ug)and(ug>0) then begin x:= 5; y:= 16; end else
if (40>ug)and(ug>20) then begin x:= 7; y:= 7; end else
if (60>ug)and(ug>40) then begin x:= 8; y:= 5; end else
if (80>ug)and(ug>60) then begin x:= 9; y:= 7; end else
if (100>ug)and(ug>80) then begin x:=11; y:= 16; end;
if (a<25)and(b<150) then begin x:= 8; y:= 16; end;
AndMask.Canvas.Ellipse(0,0,14,32); //глаз
AndMask.Canvas.Ellipse(18,0,32,32);
XOrMask.Canvas.Ellipse(x-r,y-r,x+r,y+r); //зрачок //r- радиус зрачка
XOrMask.Canvas.Ellipse(x-r+16,y-r,x+r+16,y+r);
Помещаем наше чудо в трей и по таймеру обновляем:
Shell_NotifyIcon(NIM_ADD,@no);
Shell_NotifyIcon(NIM_MODIFY,@no);
procedure Ontmr2(uTimerID, uMessage: uint;dwUser, dw1, dw2: dword) stdcall;
begin
see_tray(handle, hint, true)
end;
… теперь и у нас тотальная
слежка под нашим контролем .
Ссылки:
Контактная информация:
raxp@mail.zp.ua
26.04.2006
[Переход к списку статей]
|