страничка tripsin'а


Главная | Статьи | Заметки | Файлы| Ссылки | я

Создание иконки с PopUp-меню в TrayBar.

Иконка в трее создается обыкновенно: с помощью 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.
Hosted by uCoz