В Windows 2000, формат структуры NotifyIconData, которая используется для работы с иконками в Трее (которая, кстати, называется "The Taskbar Notification Area" :) значительно отличается от предыдущий версий Windows. Однако, эти изменения НЕ отражены в юните ShellAPI.pas в Delphi 5.
Итак, нам понадобится преобразованный SHELLAPI.H, в котором присутствуют все необходимые объявления:
Code: |
uses Windows;
type NotifyIconData_50 = 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; |
А это набор вспомогательных типов:
Code: |
type TBalloonTimeout = 10..30 {seconds}; TBalloonIconType = (bitNone, // нет иконки bitInfo, // информационная иконка (синяя) bitWarning, // иконка восклицания (ж?лтая) bitError); // иконка ошибки (краснаа) |
Теперь мы готовы приступить к созданию округлённых подсказок! Для этого воспользуемся следующей функцией:
Code: |
uses SysUtils, Windows, ShellAPI;
function DZBalloonTrayIcon(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; |
Вызывается она следующим образом:
Code: |
DZBalloonTrayIcon(Form1.Handle, 1, 10, 'this is the balloon text', 'title', bitWarning); |
Иконка, должна быть предварительно добавлена с темже дескриптором окна и IconID (в данном примере Form1.Handle и 1).
Можете попробовать все три типа иконок внутри всплывающей подсказки.
P.S. На всякий случай, ниже представлены функции для добавление/удаления иконок в трее:
Code: |
uses SysUtils, Windows, ShellAPI;
{добавление иконки}
function DZAddTrayIcon(const Window: HWND; const IconID: Byte; const Icon: HICON; const Hint: string = ''): Boolean; var NID: NotifyIconData; begin FillChar(NID, SizeOf(NotifyIconData), 0); with NID do begin cbSize := SizeOf(NotifyIconData); Wnd := Window; uID := IconID; if Hint = '' then begin uFlags := NIF_ICON; end {if} else begin uFlags := NIF_ICON or NIF_TIP; StrPCopy(szTip, Hint); end {else}; hIcon := Icon; end {with}; Result := Shell_NotifyIcon(NIM_ADD, @NID); end;
{добавляет иконку с call-back сообщением}
function DZAddTrayIconMsg(const Window: HWND; const IconID: Byte; const Icon: HICON; const Msg: Cardinal; const Hint: string = ''): Boolean; var NID: NotifyIconData; begin FillChar(NID, SizeOf(NotifyIconData), 0); with NID do begin cbSize := SizeOf(NotifyIconData); Wnd := Window; uID := IconID; if Hint = '' then begin uFlags := NIF_ICON or NIF_MESSAGE; end {if} else begin uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP; StrPCopy(szTip, Hint); end {else}; uCallbackMessage := Msg; hIcon := Icon; end {with}; Result := Shell_NotifyIcon(NIM_ADD, @NID); end;
{удаляет иконку}
function DZRemoveTrayIcon(const Window: HWND; const IconID: Byte): Boolean; var NID: NotifyIconData; begin FillChar(NID, SizeOf(NotifyIconData), 0); with NID do begin cbSize := SizeOf(NotifyIconData); Wnd := Window; uID := IconID; end {with}; Result := Shell_NotifyIcon(NIM_DELETE, @NID); end; |
Несколько заключительных замечаний:
Нет необходимости использовать большую структуру NotifyIconData_50 для добавления или удаления иконок, старая добрая структура NotifyIconData прекрасно подойдёт для этого.
Для callback сообщения можно использовать WM_APP + что-нибудь.
Используя различные IconID, легко можно добавить несколько различных иконок из одного родительского окна и работать с ними по их IconID.
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!