Подписаться на RSS рассылку
Главная » Статьи по Delphi » Программа и интерфейс » Работать с Tray без компонентов.

Работать с Tray без компонентов.

Автор: zuby

Работать с трей без компонентов не очень удобно и понятно, но если один раз понять, то левые компоненты уже не нужны, т.к. можно реализовать всё что угодно. 

Во первых изменим стандартный 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;
e
nd;
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);
Вроде все! Желаю удачи!

Просмотров: 7122

Обсудить на форуме


Имя *:
Email:


Код *:

Copyright © 2008-2016 Программирование на Delphi для начинающих и не только

Полнота авторских прав на все материалы, опубликованные на сервере DelphiDevelop.ru принадлежит их авторам

Перепечатка материалов разрешается с указанием авторства и гиперссылки на первоисточник информации

Хостинг от uCoz

Автор проекта: Борисов Сергей

e-mail: save-x@yandex.ru

Связь с администрацией сайта