Компоненты Rave Reports и отчеты в приложении Delphi

       

Над значком, помещенным на панель System Tray, видна строка подсказки



Рисунок 31.1. Над значком, помещенным на панель System Tray, видна строка подсказки


Сообщение, задаваемое в поле uCallbackMessage, по сути дела является единственной ниточкой, связывающей вас со значком после его создания. Оно объединяет в себе несколько сообщений. Когда к вам пришло такое сообщение (в примере, рассмотренном выше, оно имеет идентификатор WM_MYTRAYNOTIFY), поля в переданной в обработчик структуре типа TMessage распределены так. Параметр wParam содержит номер значка (тот самый, что задавался в поле uID при его создании), а параметр LParam — идентификатор сообщения от мыши, вроде WM_MOUSEMOVE, WM_LBUTTONDOWN и т. п. К сожалению, остальная информация из этих сообщений теряется. Координаты мыши в момент события придется узнать, вызвав функцию API GetCursorPos:

procedure TForml.WMICON(var msg: TMessage); 

var P : TPoint; begin case msg.LParam of

WM_LBUTTONDOWN: 

begin

GetCursorPos(p);

SetForegroundWindow(Application.MainForm.Handle); PopupMenul.Popup(P.X, P.Y);

end;

WM_LBUTTONUP : 

end;

end;

Обратите внимание, что при показе всплывающего меню недостаточно просто вызвать метод Popup. При этом нужно вынести главную форму приложения на передний план, в противном случае она не получит сообщений от меню.



Теперь решим еще две задачи. Во-первых, как сделать, чтобы приложение минимизировалось не на Панель задач (TaskBar), а на System Tray? И более того — как сразу запустить его в минимизированном виде, а показывать главную форму только по наступлении определенного события (приходу почты, наступлению определенного времени и т. п.).

Ответ на первый вопрос очевиден. Если минимизировать не только окно главной формы приложения (Application.MainForm.Handle), но и окно приложения (Application.Handle), то приложение полностью исчезнет "с экранов радаров". В этот самый момент нужно создать значок на панели System Tray. В его всплывающем меню должен быть пункт, при выборе которого оба окна восстанавливаются, а значок удаляется.

Чтобы приложение запустилось сразу в минимизированном виде и без главной формы, следует к вышесказанному добавить установку свойства Application.showMainForm в значение False. Здесь возникает одна сложность — если главная форма создавалась в невидимом состоянии, ее компоненты будут также созданы невидимыми. Поэтому при первом ее показе установим их свойство visible в значение True. Чтобы не повторять это дважды, установим флаг — глобальную переменную shownonce:

procedure TForml.HideMainForm;

 begin

Appiication.showMainForm := False;

ShowWindow(Application.Handle, SW_HIDE);

ShowWindow(Application.MainForm.Handle, SW_HIDE);

 end;

procedure TForml.RestoreMainForm;

var i,j : Integer;

begin

Appiication.showMainForm := True;

ShowWindow(Application.Handle, SW_RESTORE); ShowWindow(Application.MainForm.Handle, SW_RESTORE);

if not ShownOnce then begin

for I := 0 to Application.MainForm.ComponentCount -1 do if Application.MainForm.Components[I] is TWinControl then with Application.MainForm.Components[I] as TWinControl do if Visible then

 begin

ShowWindow(Handle, SW_SHOWDEFAULT); 

for J := 0 to ComponentCount -1 do if Components[J] is TWinControl then

ShowWindow((Components[J] as TWinControl).Handle, SW_SHOWDEFAULT);

end;

ShownOnce := True; 

end;

 end;

procedure TForml.WMSYSCOMMAND(var msg: TMessage);

 begin inherited;

if (Msg.wParam=SC_MINIMIZE) then 

begin

HideMainForm; CreateTraylcon(l) ;

 end;

 end;

procedure TForml.FileOpenltemlClick(Sender: TObject); begin

RestoreMainForm;

DeleteTraylcon(l);

end;

Теперь у вас в руках полноценный набор средств для работы с панелью System Tray. В заключение необходимо добавить, что все описанное реализуется не в операционной системе, а в оболочке ОС — Проводнике (Explorer). В принципе, и Windows NT 4/2000, и Windows 95/98 допускают замену оболочки ОС на другие, например DashBoard или LightStep. Там функции панели System Tray могут быть не реализованы или реализованы через другие API. Впрочем, случаи замены оболочки достаточно редки.

 



Содержание раздела