Погледнете вашата лента със задачи. Вижте района, където се намира времето? Има ли други икони там? Мястото се нарича Windows System Tray. Искате ли да поставите своето Delphi там е иконата на приложението? Искате ли тази икона да бъде анимирана - или да отразява състоянието на вашата кандидатура?
Това би било полезно за програми, които се пускат за дълги периоди от време без взаимодействие с потребители (фонови задачи, които обикновено продължавате да работите на вашия компютър през целия ден).
Това, което можете да направите, е да направите вашите приложения на Delphi да изглеждат така, сякаш се минимизират в тава (вместо към Задача лента, точно до бутона Win Start), като поставите икона в тавата и едновременно направете формулярите си невидим.
Нека го изтърпям
За щастие, създаването на приложение, което работи в системната област, е доста лесно - за изпълнение на задачата е необходима само една (API) функция, Shell_NotifyIcon.
Функцията е дефинирана в ShellAPI единица и изисква два параметъра. Първият е флаг, указващ дали иконата се добавя, променя или премахва, а вторият е указател към структура на TNotifyIconData, съдържаща информацията за иконата. Това включва дръжката на иконата, която трябва да се покаже, текстът, който да се покаже като съвет на инструмента, когато мишката е над иконата, дръжка на прозореца, която ще получава съобщенията на иконата и типа на съобщението, което иконата ще изпрати към това прозорец.
Първо, в частния раздел на основната ви форма поставете реда:
TrayIconData: TNotifyIconData;
Тип
TMainForm = клас(TForm)
процедура FormCreate (подател: TObject);
частен
TrayIconData: TNotifyIconData;
{Частни декларации}обществен{Публични декларации}край;
След това, в основната ви форма OnCreate метод, инициализирайте структурата на данни TrayIconData и извикайте функцията Shell_NotifyIcon:
с TrayIconData dobegin
cbSize: = SizeOf (TrayIconData);
Wnd: = Дръжка;
uID: = 0;
uFlags: = NIF_MESSAGE + NIF_ICON + NIF_TIP;
uCallbackMessage: = WM_ICONTRAY;
hIcon: = Приложение. Икона. Дръжка;
StrPCopy (szTip, Приложение. Заглавие);
край;
Shell_NotifyIcon (NIM_ADD, @TrayIconData);
Параметърът Wnd на структурата TrayIconData сочи към прозореца, който получава съобщения за известия, свързани с икона.
HIcon сочи иконата, която искаме да добавим към тавата - в този случай се използва основната икона на Applications.
SzTip държи текста на Tooltip за показване на иконата - в нашия случай заглавието на приложението. SzTip може да съдържа до 64 знака.
Параметърът uFlags е зададен да казва на иконата за обработка на съобщения от приложението, използвайте иконата на приложението и неговия съвет. Най- uCallbackMessage сочи към определения от приложението идентификатор на съобщението. Системата използва посочения идентификатор за известителни съобщения, които изпраща до прозореца, идентифициран от Wnd, когато се случи събитие на мишката в ограничаващия правоъгълник на иконата. Този параметър е зададен на WM_ICONTRAY константа, дефинирана в секцията на интерфейса на единицата за формуляри и е равна: WM_USER + 1;
Добавяте иконата в тавата, като извиквате функцията API на Shell_NotifyIcon. Първият параметър "NIM_ADD" добавя икона в областта на тава. Останалите две възможни стойности, NIM_DELETE и NIM_MODIFY се използват за изтриване или промяна на икона в тавата - ще видим как по-нататък в тази статия. Вторият параметър, който изпращаме към Shell_NotifyIcon, е инициализираната структура TrayIconData.
Вземете един
Ако РАБИТЕ проекта си сега, ще видите икона близо до часовника в тавата. Забележете три неща.
1) Първо, нищо не се случва, когато щракнете (или направите нещо друго с мишката) върху иконата, поставена в тавата - все още не сме създали процедура (обработващ съобщения).
2) Второ, на лентата със задачи има бутон (явно не го искаме там).
3) Трето, когато затворите приложението си, иконата остава в тавата.
Вземи две
Нека решим това назад. За да премахнете иконата от тавата, когато излезете от приложението, трябва да се обадите отново на Shell_NotifyIcon, но с NIM_DELETE като първи параметър. Правите това в OnDestroy обработващ събитията за основната форма.
процедура TMainForm. FormDestroy (подател: TObject);
започвам
Shell_NotifyIcon (NIM_DELETE, @TrayIconData);
край;
За да скрием приложението (бутона на приложението) от лентата на задачите, ще използваме прост трик. В изходния код на Projects добавете следния ред: Приложение. ShowMainForm: = Грешно; преди Приложението. CreateForm (TMainForm, MainForm); E.g нека изглежда така:
...
започвам
Приложение. Инициализиране;
Приложение. ShowMainForm: = Грешно;
Приложение. CreateForm (TMainForm, MainForm);
Приложение. Пусни;
край.
И накрая, за да може нашата икона на Tray да реагира на събитията с мишката, трябва да създадем процедура за обработка на съобщения. Първо, ние декларираме процедура за обработка на съобщения в публичната част на декларацията на формуляра: процедура TrayMessage (var Msg: TMessage); съобщение WM_ICONTRAY; Второ, определението на тази процедура изглежда така:
процедура TMainForm. TrayMessage (Var Msg: TMessage);
begincase Msg.lParam на
WM_LBUTTONDOWN:
започвам
ShowMessage („Кликнете върху левия бутон
- нека покажем формуляра! ');
MainForm. Покажи;
край;
WM_RBUTTONDOWN:
започвам
ShowMessage („Натиснат десен бутон
- нека скрием формуляра! ');
MainForm. Крия;
край;
край;
край;
Тази процедура е предназначена да обработва само нашето съобщение, WM_ICONTRAY. Той приема стойността на LParam от структурата на съобщението, която може да ни даде състоянието на мишката при активиране на процедурата. За простота ще се справяме само с лявата мишка надолу (WM_LBUTTONDOWN) и с дясната мишка надолу (WM_RBUTTONDOWN). Когато левият бутон на мишката е надолу върху иконата, ние показваме основната форма, когато десният бутон е натиснат го скриваме. Разбира се, има и други съобщения за въвеждане на мишка, с които можете да се справите в процедурата, например, бутон нагоре, бутон двойно щракване и т.н.
Това е. Бързо и лесно. След това ще видите как да анимирате иконата в тавата и как тази икона да отразява състоянието на вашето приложение. Още повече ще видите как да покажете изскачащо меню близо до иконата.