Работать с трей без компонентов не очень удобно и понятно, но если один раз понять, то левые компоненты уже не нужны, т.к. можно реализовать всё что угодно. Во первых изменим стандартный TNotifyIconData на Z_TrayNotify, т.к. в стандарте szTip имеет 63 символа и это не очень удобно. type Z_TrayNotify = record cbSize: DWORD; Wnd: HWND; uID: UINT; uFlags: UINT; uCallbackMessage: UINT; hIcon: HICON; szTip: array [0..MAXCHAR] of AnsiChar; end; Во вторых добавим const Ztray = WM_USER + 202; Теперь две функции которые будут работать с трей.
function Z_AddTray(const Window: HWND; const IconID: Byte; const Icon: HICON; const dwMsg: Cardinal; const Hint: string = ''): Boolean; var NID: Z_TrayNotify; begin FillChar(NID, SizeOf(Z_TrayNotify), 0); with NID do begin cbSize := SizeOf(Z_TrayNotify); Wnd := Window; uID := IconID; uFlags := NIF_ICON or NIF_TIP or NIF_MESSAGE; StrPCopy(szTip, Hint); hIcon := Icon; uCallbackMessage := ZTray; end Result := Shell_NotifyIcon(dwMsg, @NID); end; С помощью этой функции можно Добавлять и Изменять иконку и подсказку. function Z_DeleteTray(const Window: HWND): Boolean;
var
NID: Z_TrayNotify;
begin
FillChar(NID, SizeOf(Z_TrayNotify), 0); with NID do
begin
cbSize := SizeOf(Z_TrayNotify);
Wnd := Window; end;
Result := Shell_NotifyIcon(NIM_DELETE, @NID);
end;
С помощью этой функции удаляем иконку из трей. В третьих добавим после private вот этот обработчик сообщения (ZTray)function TrayNotify(var Msg: TMessage): boolean; и конечно сам обработчикfunction TForm1.TrayNotify(var Msg: TMessage): boolean;
{
var
cur: TPoint;
}
begin
{GetCursorPos(Cur);}
Result := false;
case Msg.Msg of ZTray:
case (Msg.LParam) of
WM_RBUTTONUP: Application.Restore;
{WM_RBUTTONUP:
begin
SetForegroundWindow(Form1.Handle);
TrayMenu.Popup(cur.x, cur.y); end;}
WM_LBUTTONUp: Application.Minimize;
end; end; end; WM_LBUTTONUP - сворачивает приложение WM_RBUTTONUP - восстанавливает, еще можно добавить меню (TrayMenu - TPopupMenu) и убрать все что в скобках { } Теперь как с этим работать. Сразу при создании формы пишемApplication.HookMainWindow(TrayNotify); Ставится hook на отлов сообщения. При close или destroy пишемZ_DeleteTray(Application.Handle); // на всякий случай
Application.unHookMainWindow(TrayNotify); Снимаем hook На форме 3 кнопки и TrayIcons - TImageList. TrayIcons имеет две картинки 1 кнопка - создание иконкиvar
tIc: TIcon; begin
tIc := TIcon.Create;
TrayIcons.GetIcon(0, tIc);
Z_AddTray(Application.Handle, 0, tIc.Handle, NIM_ADD,
'ЛКМ = Свернуть.' + #13 +
'ПКМ = Развернуть.');
tIc.Free; end; 2 кнопка - изменение иконки и подсказкиvar
tIc: TIcon; begin tIc := TIcon.Create;
TrayIcons.GetIcon(1, tIc);
Z_AddTray(Application.Handle, 0, tIc.Handle, NIM_MODIFY,
'Поменял Hint(подсказку) и иконку.' + #13 + 'Всего Hint вмещает 128 символов');
tIc.Free; end;
3 кнопка - удаление иконкиZ_DeleteTray(Application.Handle);
|