Понедельник, 29.04.2024
Королевство Delphi
Главное меню
Статьи
Наш опрос
Нужен форум на сайте?
Всего ответов: 90
Статистика
Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Главная » Статьи » Система » Разное

Отображение округленного окошка подсказок для значка приложения в 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).

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

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

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

Получить ссылку на материал

Категория: Разное | Добавил: Барон (20.12.2011)
Просмотров: 822 | Теги: system, окно, значок, Tray, подсказка | Рейтинг: 0.0/0
[ Пожертвования для сайта ] [ Пожаловаться на материал ]

Если вам помог материал сайта кликните по оплаченной рекламе размещенной в центре

Поиск
Категории раздела
ActiveX [10]
CORBA и COM [16]
Kol и MCK [23]
WinAPI [28]
Компоненты [27]
Работа с Bluetooth [4]
Железо [8]
Текст [18]
Разное [98]
Королевство Delphi © 2010-2024
Яндекс цитирования