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

В 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.
Теги:
System Tray
Добавлено: 02 Августа 2018 07:43:52 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...