Карта сайтаСсылкиКонтакты

Отображение округленного окошка подсказок для значка приложения в System Tray

PDF Печать
Статьи

В Windows 2000 и выше, формат структуры NotifyIconData, которая используется для работы с иконками в Трее (которая, кстати, называется "The Taskbar Notification Area" значительно отличается от предыдущий версий Windows. Однако, эти изменения НЕ отражены в юните ShellAPI.pas в Delphi 5.

Итак, нам понадобится преобразованный SHELLAPI.H, в котором присутствуют все необходимые объявления:


uses Windows;

type
  NotifyIconData_50 = packed record // определённая в shellapi.h
  cbSize: DWORD;
  Wnd: HWND;
  uID: UINT;
  uFlags: UINT;
  uCallbackMessage: UINT;
  hIcon: HICON;
  szTip: array[0..MAXCHAR] of AnsiChar;
  dwState: DWORD;
  dwStateMask: DWORD;
  szInfo: array[0..MAXBYTE] of AnsiChar;
  uTimeout: UINT; // union with uVersion: UINT;
  szInfoTitle: array[0..63] of AnsiChar;
  dwInfoFlags: DWORD;
end {record};

const
  NIF_INFO = $00000010;
  NIIF_NONE = $00000000;
  NIIF_INFO = $00000001;
  NIIF_WARNING = $00000002;
  NIIF_ERROR = $00000003;

А это набор вспомогательных типов:


type
  TBalloonTimeout = 10..30{seconds};
  TBalloonIconType = (bitNone, // нет иконки
  bitInfo, // информационная иконка (синяя)
  bitWarning, // иконка восклицания (жёлтая)
  bitError); // иконка ошибки (красная)

Теперь мы готовы приступить к созданию округлённых подсказок!

Для этого воспользуемся следующей функцией:


uses
  SysUtils, Windows, ShellAPI;

function BalloonTrayIcon(const Window: HWND; const IconID:
  Byte; const Timeout: TBalloonTimeout; const BalloonText,
  BalloonTitle: String; 
  const BalloonIconType: TBalloonIconType): Boolean;
const
  aBalloonIconTypes : array[TBalloonIconType] of Byte = 
      (NIIF_NONE, NIIF_INFO, NIIF_WARNING, NIIF_ERROR);
var
  NID_50 : NotifyIconData_50;
begin
  FillChar(NID_50, SizeOf(NotifyIconData_50), 0);
  with NID_50 do
  begin
    cbSize := SizeOf(NotifyIconData_50);
    Wnd := Window;
    uID := IconID;
    uFlags := NIF_INFO;
    StrPCopy(szInfo, BalloonText);
    uTimeout := Timeout * 1000;
    StrPCopy(szInfoTitle, BalloonTitle);
    dwInfoFlags := aBalloonIconTypes[BalloonIconType];
  end {with};
  Result := Shell_NotifyIcon(NIM_MODIFY, @NID_50);
end;

Вызывается она следующим образом:


BalloonTrayIcon(Form1.Handle, 1, 10, 'this is the balloon text', 
    'title', bitWarning);

Иконка, должна быть предварительно добавлена с тем же дескриптором окна и IconID (в данном примере Form1.Handle и 1).

Можете попробовать все три типа иконок внутри всплывающей подсказки.

Несколько заключительных замечаний:

  • Нет необходимости использовать большую структуру NotifyIconData_50 для добавления или удаления иконок, старая добрая структура NotifyIconData прекрасно подойдёт для этого.
  • Для callback сообщения можно использовать WM_APP + что-нибудь.
  • Используя различные IconID, легко можно добавить несколько различных иконок из одного родительского окна и работать с ними по их IconID.

По материалам http://delphi.int.ru


 

Добавить комментарий


Защитный код
Обновить