Во первых изменим стандартный 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);С помощью этой функции удаляем иконку из трей. В третьих добавим после private вот этот обработчик сообщения (ZTray)
with NID do begin cbSize := SizeOf(Z_TrayNotify); Wnd := Window;
end; Result := Shell_NotifyIcon(NIM_DELETE, @NID); end;
function TrayNotify(var Msg: TMessage): boolean;и конечно сам обработчик
function TForm1.TrayNotify(var Msg: TMessage): boolean; { var cur: TPoint; } begin {GetCursorPos(Cur);} Result := false; case Msg.Msg ofWM_LBUTTONUP - сворачивает приложение WM_RBUTTONUP - восстанавливает, еще можно добавить меню (TrayMenu - TPopupMenu) и убрать все что в скобках { } Теперь как с этим работать. Сразу при создании формы пишем
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;
Application.HookMainWindow(TrayNotify);Ставится hook на отлов сообщения. При close или destroy пишем
Z_DeleteTray(Application.Handle); // на всякий случай Application.unHookMainWindow(TrayNotify);Снимаем hook На форме 3 кнопки и TrayIcons - TImageList. TrayIcons имеет две картинки 1 кнопка - создание иконки
var tIc: TIcon;2 кнопка - изменение иконки и подсказки
begin tIc := TIcon.Create; TrayIcons.GetIcon(0, tIc); Z_AddTray(Application.Handle, 0, tIc.Handle, NIM_ADD, 'ЛКМ = Свернуть.' + #13 + 'ПКМ = Развернуть.'); tIc.Free;
end;
var tIc: TIcon;3 кнопка - удаление иконки
begin
tIc := TIcon.Create; TrayIcons.GetIcon(1, tIc); Z_AddTray(Application.Handle, 0, tIc.Handle, NIM_MODIFY, 'Поменял Hint(подсказку) и иконку.' + #13 +
'Всего Hint вмещает 128 символов'); tIc.Free;
end;
Z_DeleteTray(Application.Handle);Вроде все! Желаю удачи!
Просмотров: 7433
Copyright © 2008 - 2018 Программирование на Delphi для начинающих и не только.
Полнота авторских прав на все материалы, опубликованные на сервере DelphiDevelop.ru принадлежит их авторам.
Перепечатка материалов разрешается с указанием авторства и гиперссылки на первоисточник информации.