В первой части, рассматриваемой статьи мы познакомились с компонентом 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 и на всякий пожарный, прикладываю рабочий исходник.
Скачать
Казалось бы что еще можно рассматривать, вроде и так все ясно. Так то оно так, да не
совсем. Например, при минимизации приложения, оно помимо того, что отображается в трее, в добавок ко всему отображается еще и в панели задач. Во многих серьёзных проектах, например, при сворачивании главного окна, программа вися в трее, на панели задач не отображается. Лично я считаю, что это правильно как с позиции логики, так и с позиции эргономики реализации интерфейса. В интернете полно рецептов, рабочих и не очень, я расскажу Вам как это делаю я. Как я уже говорил, что не являюсь "правильным" программистом, так что на истину в последней инстанции не претендую. В общем очень хотелось бы, чтобы при минимизации нашего приложения, форма исчезала бы с панели задач, а по клику на иконке в трее, принимало бы исходный развернутый вид.
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 и на всякий пожарный, прикладываю рабочий исходник.
Скачать
Комментариев нет:
Отправить комментарий
Примечание. Отправлять комментарии могут только участники этого блога.