Как показать округлённое окошко подсказки в Tray в Windows2000
В Windows 2000, формат структуры NotifyIconData, которая используется для
работы с иконками в Трее (которая, кстати, называется "The Taskbar Notification
Area" :) значительно отличается от предыдущий версий Windows. Однако, эти
изменения НЕ отражены в юните ShellAPI.pas в Delphi 5.
Итак, нам понадобится преобразованный SHELLAPI.H, в котором присутствуют все
необходимые объявления:
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;
DZBalloonTrayIcon(Form1.Handle, 1, 10,
'this is the balloon text', 'title', bitWarning);
Иконка, должна быть предварительно добавлена с темже дескриптором окна и IconID (в данном примере Form1.Handle и 1).
Можете попробовать все три типа иконок внутри всплывающей подсказки.
P.S. На всякий случай, ниже представлены функции для добавление/удаления иконок в трее:
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 dobegin
cbSize := SizeOf(NotifyIconData);
Wnd := Window;
uID := IconID;
if Hint = '' thenbegin
uFlags := NIF_ICON;
end{if}elsebegin
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 dobegin
cbSize := SizeOf(NotifyIconData);
Wnd := Window;
uID := IconID;
if Hint = '' thenbegin
uFlags := NIF_ICON or NIF_MESSAGE;
end{if}elsebegin
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 dobegin
cbSize := SizeOf(NotifyIconData);
Wnd := Window;
uID := IconID;
end{with};
Result := Shell_NotifyIcon(NIM_DELETE, @NID);
end;
Несколько заключительных замечаний:
Нет необходимости использовать большую структуру NotifyIconData_50 для добавления или удаления иконок, старая добрая структура NotifyIconData прекрасно подойдёт для этого.
Для callback сообщения можно использовать WM_APP + что-нибудь.
Используя различные IconID, легко можно добавить несколько различных иконок из одного родительского окна и работать с ними по их IconID.
Статья Как показать округлённое окошко подсказки в Tray в Windows2000 раздела Синтаксис Hint подсказки может быть полезна для разработчиков на Delphi и FreePascal.
Комментарии и вопросы
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.