воскресенье, 7 июня 2015 г.

TrayIcon работа с компонентом (часть 2)

    В первой части, рассматриваемой статьи мы познакомились с компонентом TrayIcon, подразумевается, что форма приложения у Вас запущена, и компоненты настроены согласно предыдущей статьи.
    Казалось бы что еще можно рассматривать, вроде и так все ясно. Так то оно так, да не
совсем. Например, при минимизации приложения, оно помимо того, что отображается в трее, в добавок ко всему отображается еще и в панели задач. Во многих серьёзных проектах, например, при сворачивании главного окна, программа вися в трее, на панели задач не отображается. Лично я считаю, что это правильно как с позиции логики, так и с позиции эргономики реализации интерфейса. В интернете полно рецептов, рабочих и не очень, я расскажу Вам как это делаю я. Как я уже говорил, что не являюсь "правильным" программистом, так что на истину в последней инстанции не претендую. В общем очень хотелось бы, чтобы при минимизации нашего приложения, форма исчезала бы с панели задач, а по клику на иконке в трее, принимало бы исходный развернутый вид.

1) Для этого в разделе private создадим процедуру:

procedure WMSysCommand(var Message: TMessage); message WM_SYSCOMMAND;
    
кликаем на ней, нажимаем Ctrl+Shift+C в теле процедуры прописываем:

procedure TForm1.WMSysCommand(var Message: TMessage);

begin

if SendMessage(Handle, WM_NCHITTEST, 0, Message.LParam) = HTMINBUTTON then

begin

ShowWindow(Application.Handle, sw_Hide);
Application.MainForm.Hide;
ShowWindow(Handle,SW_HIDE);

end;

inherited

end;

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

Для этого создадим событие TrayIcon1DblClick, где пропишем:

procedure TForm1.TrayIcon1DblClick(Sender: TObject);

begin

if ShowWindow(Handle, sw_Show) then

begin

ShowWindow(Application.Handle, sw_Hide);
Application.MainForm.Hide;
ShowWindow(Handle, SW_HIDE);

end

else

begin

Application.BringToFront;

end;
end;

   2) Cнимем пока TrayIcon1.ShowBalloonHint; с события TrayIcon1Click, добавим на форму компонент PopupMenu. В TrayIcon1 свойство PopupMenu выбираем PopupMenu1. Там же создаём обработчик событий PopupMenu - OnChange-PopupMenu1Change где указываем

procedure TForm1.PopupMenu1Change(Sender: TObject; Source: TMenuItem;
Rebuild: Boolean);

begin

TrayIcon1.ShowBalloonHint;


end;

    Если теперь запустим наше приложение, то по одинарному клику будет выводиться сообщение Baloon, а по двойному - открываться и сворачиваться наша главная форма. С помощью Popup можно создавать целые подпункты, на которые также можно "вешать" различные события.

  3) Иногда нужно сделать как в торренте, чтобы при закрытии программы, она сворачивалась в трей. Применительно к нашему случаю в событии onClose формы, можем записать:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

Action:=caNone;
ShowWindow(Handle,SW_HIDE);
ShowWindow(Application.Handle, sw_Hide);
Application.MainForm.Hide;

end;

Только нужно дополнительно поместить на форме кнопку и записать на её onClick
- Application.Terminate; чтобы приложение реально теперь было закрыть.
Ну вот собственно пока все. Мало ли у кого что будет получаться, сразу оговорюсь, пишу в Delphi XE7  и  OS Win 8.1 и на всякий пожарный, прикладываю рабочий исходник.
Скачать

Комментариев нет:

Отправить комментарий

Примечание. Отправлять комментарии могут только участники этого блога.