Вопросы и Ответы
36. Каким образом работать с иконками расположенными в панели задач Win'95?
Функция работы с, так называемыми, нотификационными иконками, которые находятся в правой части панели задач Windows'95, определена в модуле ShellAPI:
function Shell_NotifyIcon(dwMessage: DWORD; lpData: PNotifyIconData): BOOL;
В зависимости от переданного сообщения в параметре dwMessage, эта функция может добавлять, модифицировать или удалять иконки, данные о которых передаются в параметре lpData. Поддерживаются три сообщения:
Сообщение |
Описание |
NIM_ADD | Добавить иконку в панель задач. |
NIM_MODIFY | Изменить параметры иконки в панели задач. |
NIM_DELETE | Удалить иконку из панели задач. |
Для работы с нотификационными иконками необходимо правильно заполнить поля данных, которые содержатся в структуре TNotifyIconData:
Поле |
Тип |
Описание |
||||||||
cbSize |
DWORD |
Размер передаваемой структуры. | ||||||||
Wnd |
HWND |
Указатель на главное окно программы. | ||||||||
uID |
UINT |
Идентификатор иконки. | ||||||||
uFlags |
UINT |
Устанавливаемые флаги:
|
||||||||
uCallbackMessage |
UINT |
Номер сообщения посылаемого иконкой при щелчке на ней мышью. | ||||||||
hIcon |
HICON |
Указатель на используемую иконку. | ||||||||
szTip |
array [0..63] of WideChar |
Подсказка (Hint). |
Пример:
............
uses ShellAPI;
var NID :TNotifyIconData;
............
{Добавление} {Установка
необходимых значений в поля структуры TNotifyIconData} uFlags
:= NIF_ICON OR NIF_TIP OR NIF_MESSAGE; END; end; ............ {Изменение} {Установка
новых значений в поля структуры TNotifyIconData} szTip
:= 'Пример подсказки 1'+#0; END; end; ............ {Удаление
иконки из панели задач} IF
Shell_NotifyIcon(NIM_DELETE,@NID) THEN MessageBeep(0); end; ............ {Процедура
реакции на события передаваемые иконкой} {Проверка
на принадлежность сообщения иконке} WM_RBUTTONUP
: BEGIN GetCursorPos(CursorPos); END; WM_LBUTTONDBLCLK
: ShowMessage('Двойной
щелчок мыши!'); END; end; ............ P.S. Использование
нотификационных иконок в Delphi вызывает некоторые
сложности, так как, необходимо прятать окно и
оставлять на экране только иконку, а простое
использование свойства Visible не дает необходимого
результата. Выход из этого положения видится,
только, в отказе от использования объекта TApplication
и работе с функциями API напрямую. Данный подход
хорош еще и тем, что эти программы постоянно
находятся в памяти, а использование в них
объектно-ориентированной библиотеки Delphi будет
отнимать слишком много ресурсов.
procedure TForm1.bAddClick(Sender: TObject);
begin
WITH NID DO BEGIN
cbSize := SizeOf(NID);
uID := 123;
Wnd := Handle;
szTip := 'Пример подсказки'+#0;
hIcon := Application.Icon.Handle;
uCallBackMessage := WM_USER+10;
{Добавление иконки в панель
задач}
IF Shell_NotifyIcon(NIM_ADD,@NID) THEN MessageBeep(0);
procedure TForm1.bModifyClick(Sender: TObject);
begin
WITH NID DO BEGIN
hIcon := LoadIcon(0,IDI_ASTERISK);
{Изменение иконки в панели
задач}
IF Shell_NotifyIcon(NIM_MODIFY,@NID) THEN MessageBeep(0);
procedure TForm1.bDeleteClick(Sender: TObject);
begin
procedure TForm1.WndProc(var M: TMessage);
var CursorPos: TPoint;
begin
IF M.Msg = WM_USER+10 THEN
{Реакция на необходимые
события}
CASE M.LParam OF
PopupMenu1.Popup(CursorPos.X, CursorPos.Y);
{Передача необработанных
сообщений дальше}
INHERITED WndProc(M);
...предыдущая страница следующая...
оглавление