Секрети іконки в системному треї

Отже, це друга частина моєї невеликої "епопеї", присвячене іконці в системній треї.

Сьогодні ми розглянемо і навчимося вирішувати такі питання:
1. Як додати спливаюче меню до іконки?
2. Як приховувати головну форму додатку при запуску, і показиваеть його по команді спливаючого меню.

Модернізація програми закінчена. Ваша головна форма повинна виглядати приблизно так:

Тепер, давайте приступимо до вирішення питань, заданих на початку статті.

Далі, давайте напишемо потрібні коди в обробниках подій натискання кнопки миші в кожному з пунктів меню:

Пункт "Про програму":
procedure TForm1.PAboutClick (Sender: TObject);
begin
// Показуємо головну форму в розкритою областю "Про програму"
AboutClick (Form1); // Виконуємо процедуру натискання на кнопку "Про програму"
Form1.Show; // І, ​​саме ось такий рядком, ми показуємо
// головну форму додатку.
Form1.Activate; //..і активуємо її :)
end;

Пункт "Налаштування":
procedure TForm1.PSettingsClick (Sender: TObject);
begin
// Опис зморив вище :)
Form1.Show;
Form1.Activate;
end;

Пункт "Вихід":
procedure TForm1.PExitClick (Sender: TObject);
begin
Close; // звичайний вихід з програми.
end;

А зараз ми зробимо найголовніше і найцікавіше: змусимо наше меню "спливати" на іконці під час натискання правої кнопки миші, а нашу головну форму "показуватися" при подвійний натисненні лівої кнопки миші.

У вихідному коді програми знайдіть процедуру IconCallBackMessage і модернізуйте її так, щоб вона виглядала так, як показано нижче:

procedure TForm1.IconCallBackMessage (var Mess. TMessage);
var Mouse: TMouse;
begin
case Mess.lParam of
// Тут Ви можете обробляти всі події, що відбуваються на іконці :)
// На головній формі я спеціально розташував дві мітки, в яких,
// при виникненні якої-небудь події буде писатися що саме сталося :)
// Але, тепер у другій частині під час деяких подій будуть відбувається
// реальні процеси.
WM_LBUTTONDBLCLK. // Обробляємо подвійне клацання лівої кнопки миші.
begin
PSettingsClick (Form1); // Виконуємо пункт меню "Налаштування".
end;
WM_LBUTTONDOWN. TI_Event.Caption: = 'Натискання лівої кнопки миші';
WM_LBUTTONUP. TI_Event.Caption: = 'віджатий лівої кнопки миші';
WM_MBUTTONDBLCLK. TI_DC.Caption: = 'Подвійний клік середньою кнопкою миші';
WM_MBUTTONDOWN. TI_Event.Caption: = 'Натискання середньої кнопки миші';
WM_MBUTTONUP. TI_Event.Caption: = 'віджатий середньої кнопки миші';
WM_MOUSEMOVE. TI_Event.Caption: = 'Переміщення миші';
WM_MOUSEWHEEL. TI_Event.Caption: = 'Обертання коліщатка миші';
WM_RBUTTONDBLCLK. TI_DC.Caption: = 'Подвійний клік правою кнопкою';
WM_RBUTTONDOWN. TI_Event.Caption: = 'Натискання правої кнопки миші';
WM_RBUTTONUP. // Обробляємо натискання правою кнопкою миші.
begin
PopupMenu.Popup (Mouse.CursorPos.x, Mouse.CursorPos.y);
// змушуємо "спливти" наше меню :)
end;
end;
end;

З першою подією подвійного натискання лівої кнопки миші напевно все зрозуміло - ми виконуємо викликаємо обробник події натискання кнопки миші на пункті меню "Налаштування".
Але, з натисканням правої кнопки миші напевно важче так? Щож, все по порядку:
На самому початку процедури ми оголошуємо об'єкт Mouse типу TMouse. Для того, щоб пізніше за допомогою нього дізнатися координати миші на екрані.
Далі ми пишемо наступну строчку:
PopupMenu.Popup (Mouse.CursorPos.x, Mouse.CursorPos.y);
Сенс її простий. Метод Popup використовується для показу меню в заданій точці екрану. Саме тут нам у пригоді об'єкт Mouse. за допомогою властивостей якого, ми дізнаємося координати миші на екрані, під час натискання правої кнопки миші.
Але, в "Спливання" меню є ще одні нюанс. Якщо зараз все залишити все як є, воно буде "зависати" при втрати фокусу - тобто просто не буде зникати. Для усунення даного бага в обробнику події OnPopup нашого меню впишіть наступне:
SetForegroundWindow (Form1.Handle);
Цим ми вказуємо, що активним є головна форма нашого застосування (навіть якщо він невидима). І, при перемиканні між додатки воно втрачає свою активність, і, відповідно, спливаюче меню зникає з поля зору, тому що воно є дочірнім об'єктом, по відношенню до форми.

Ось і в принципі і все :). Ах да. зовсім забув. На самому початку ми змінили напис на колишньої кнопці закриття програми на "Приховати", тобто тепер при її натисканні необхідно, щоб головна форма програми "ховалася". Щож, робиться це просто, в обробник події натискання даної кнопки впишіть одну єдину рядок:
Form1.Hide;
А ось тепер все! Сподіваюся, у міру читання статей цієї серії Вам стає все легше і легше зрозуміти ази роботи з іконкою програми в системній треї :)
Исходник до цієї статті Ви можете завантажити тут.