Работать с Tray без компонентов
Работать с трей без компонентов не очень удобно и понятно, но если один раз понять, то левые компоненты уже не нужны, т.к. можно реализовать всё что угодно.
Во первых изменим стандартный 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);Вот и всё, Удачи!
No results found.