Иконка в трее создается обыкновенно: с помощью Shell_NotifyIcon. Всплывающее меню создается динамически по правому клику мышкой по иконке. Используются функции CreatePopupMenu и AppendMenu.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ShellAPI;
const
WM_INFOBARS_TRAY = WM_USER+100; // Сообщение от иконки
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
procedure IconClick(var Msg: TMessage); message WM_INFOBARS_TRAY;
procedure Command(var Msg: TWMCommand); message WM_COMMAND;
end;
var
Form1: TForm1;
MyMenu: HMENU;
MainIcon: HIcon;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
nid: TNotifyIconData;
begin
// Создаем иконку
ZeroMemory(@nid, sizeof(nid));
nid.cbSize := sizeof(nid);
MainIcon := LoadIcon(hInstance, 'MAINICON');
nid.hIcon := MainIcon;
nid.Wnd := Self.Handle;
nid.uCallbackMessage := WM_INFOBARS_TRAY;
nid.uFlags := NIF_ICON or NIF_MESSAGE;
nid.uID := 1;
Shell_NotifyIcon(NIM_ADD, @nid);
// Создаем всплывающую менюшку
MyMenu := CreatePopupMenu;
AppendMenu(MyMenu,MF_STRING,106,'Справка');
AppendMenu(MyMenu,MF_SEPARATOR,0,nil);
AppendMenu(MyMenu,MF_STRING,107,'Выход');
end;
// Обработчик сообщения от иконки
procedure TForm1.IconClick(var Msg: TMessage);
var
pt: TPoint;
begin
// По правому клику показываем менюшку
case Msg.LParam of
WM_RBUTTONDOWN:
begin
SetForegroundWindow(Self.Handle); // Нужна, чтобы менюшка исчезала
GetCursorPos(pt);
// Показываем менюшку
TrackPopupMenuEx(MyMenu, TPM_LEFTALIGN or TPM_RIGHTBUTTON or TPM_NONOTIFY,
pt.x, pt.y, Self.Handle, nil);
end;
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
var
nid: TNotifyIconData;
begin
// Убираем иконку из трея
ZeroMemory(@nid, sizeof(nid));
nid.cbSize := sizeof(nid);
nid.Wnd := Self.Handle;
nid.uID := 1;
Shell_NotifyIcon(NIM_DELETE, @nid);
// Удаляем менюшку и загруженную иконку
DestroyMenu(MyMenu);
DestroyIcon(MainIcon);
end;
// ОБработчик сообщений менюшки (106 и 107 - идентификаторы пунктов меню)
procedure TForm1.Command(var Msg: TWMCommand);
begin
case Msg.ItemID of
106: ShowMessage('Справка');
107: Application.Terminate; // Выход
end;
end;
end.