Главная » Delphi » Программирование для оболочки Windows

0

Вывод пиктограммы на панель задач

В настоящем разделе рассматривается методика инкапсуляции индикатора панели задач (tray notification icon)  в компонент Delphi. В процессе построения компонента TTrayNotifyIcon будет продемонстрировано, что именно необходимо для создания индикатора панели задач с точки  зрения API, и то, как решаются некоторые “неразре шимые” проблемы, возникающие при попытке обеспечить функции индикаторов в рамках  компонента. Для тех, кто не знаком  с понятием “индикатор панели задач”, на поминаем, что это небольшие значки, расположенные с правой стороны панели  задач Windows  (рис. 16.1). Предполагается, что  панель  задач  находится в нижней части  эк рана.Индикатор панели задач

Рис. 16.1. Индикаторы панели задач находятся в правом нижнем уг

лу экрана

Интерфейс API

Хотите верьте, хотите нет, но в процессах создания, изменения и удаления инди

каторов панели  задач  выполняется обращение только  к одной  функции API Win32

Shell_NotifyIcon(). Эта и другие  функции, имеющие отношение к оболочке Windows,  находятся в модуле ShellAPI. Функция  Shell_NotifyIcon() определена следующим образом:

function Shell_NotifyIcon(dwMessage: DWORD;

lpData: PNotifyIconData): BOOL; stdcall;

Параметр dwMessage описывает действие, выполняемое над индикатором, и мо

жет принимать одно из значений, приведенных в табл. 16.1.

Таблица 16.1. Значения параметра dwMessage

Константа

Значение

Назначение

NIM_ADD

0

Добавляет индикатор на панель задач

NIM_MODIFY

1

Модифицирует свойства существующего индикатора

NIM_DELETE

2

Удаляет индикатор из панели  задач

Параметр lpData является указателем на запись типа TNotifyIconData. Эта за

пись определена следующим образом:

type

TNotifyIconData = record

cbSize: DWORD;

Wnd: HWND;

uID: UINT;

uFlags: UINT;

uCallbackMessage: UINT;

hIcon: HICON;

szTip: array [0..63] of AnsiChar;

end;

В поле  cbSize хранится размер записи;  это  поле  инициализируется  с помощью функции SizeOf(TNotifyIconData).

В параметре Wnd указывается дескриптор окна,  которому посылаются “обратные” (callback) сообщения от индикаторов панели задач. (Хотя здесь используется слово об ратный,  тем  не менее  реально никакого обратного вызова  не происходит; однако  в документации по Win32 для сообщений, посылаемых окну от имени индикатора пане ли задач, используется именно такой термин.)

В поле  uID задается определяемый программистом уникальный идентификатор (ID)  пиктограммы индикатора. Если в приложении для индикатора используется не сколько  пиктограмм, то нужно идентифицировать каждую из них — для этого  и пред назначено поле uID.

Значение в поле  uFlags определяет, какие  из  полей  записи TNotifyIconData

должны  учитываться  функцией Shell_NotifyIcon(), а следовательно, к каким  из

свойств пиктограммы будут применены действия, определяемые параметром dwMes-

sage.  Этот   параметр  может   быть   любой   комбинацией  флагов,  приведенных  в

табл. 16.2 (для объединения флагов  воспользуйтесь ключевым словом or).

Таблица 16.2. Возможные значения флагов поля uFlags

Константа

Значение

Назначение

NIF_MESSAGE

0

Поле uCallbackMessage используется

NIF_ICON

2

Поле hIcon используется

NIF_TIP

4

Поле szTip используется

Поле  uCallbackMessage содержит номер  сообщения Windows.  Именно это  со общение будет послано окну, определяемому полем  Wnd. Для получения значения данного поля  обычно вызывается функция RegisterWindowMessage() (или  же ис пользуется смещение от значения WM_USER). Параметр lParam посылаемого сообще ния  будет иметь  то же значение, что  и поле  uID, а параметр wParam — содержать со общение от мыши, посланное при помещении ее указателя  на индикатор.

В поле hIcon задается дескриптор пиктограммы, помещаемой на панель задач. Поле szTip должно  включать в себя строку  подсказки, оканчивающуюся нулевым

символом. Эта строка будет выводиться на экран  при  подведении указателя  мыши  к индикатору.Компонент TTrayNotifyIcon инкапсулирует функцию  Shell_NotifyIcon() в методе SendTrayMessage(), код которого приведен ниже.

procedure TTrayNotifyIcon.SendTrayMessage(Msg: DWORD; Flags: UINT);

{ Этот метод содержит вызов функции API Shell_NotifyIcon. }

begin

{ Заполнить поля записи соответствующими значениями. }

with Tnd do begin

cbSize := SizeOf(Tnd);

StrPLCopy(szTip, PChar(FHint), SizeOf(szTip));

uFlags := Flags;

uID := UINT(Self);

Wnd := IconMgr.HWindow;

uCallbackMessage := Tray_Callback;

hIcon         := ActiveIconHandle;

end;

Shell_NotifyIcon(Msg, @Tnd);

end;

В данном  методе  в поле  szTip копируется  значение закрытого поля  строкового типа FHint.

Параметр uID используется для хранения ссылки на параметр Self. Поскольку эти данные   будут внесены во  все  последующие сообщения индикаторов  панели   задач, распознавание сообщений от каждого  отдельного компонента среди  нескольких со общений от других индикаторов не составит никакого труда.

Параметру Wnd присваивается значение свойства HWindow глобальной перемен ной IconMgr типа TIconMgr. Реализация этого  объекта приведена далее в настоящей главе,  но пока  важно  знать,  что  все сообщения индикаторов панели  задач  отправля ются именно через данный компонент.

Параметру uCallbackMessage присваивается значение сообщения DDGM_TRAYICON, определенное с помощью вызова  функции API RegisterWindowMessage(). Это  гаран тирует, что сообщение DDGM_TRAYICON будет иметь уникальный идентификатор сообщения (message ID) в масштабе  всей  системы. Данная  задача  решается с помощью следующего фрагмента кода:

const

{ Строка для идентификации зарегистрированного

сообщения Windows. }

TrayMsgStr = ‘DDG.TrayNotifyIconMsg';

initialization

{ Получить уникальный идентификатор сообщения Windows для

обратного вызова из панели задач. }

DDGM_TRAYICON := RegisterWindowMessage(TrayMsgStr);

В параметр hIcon помещается значение, возвращаемое методом ActiveIconHan- dle(). Этот  метод  возвращает дескриптор пиктограммы, выбранной в данный мо мент в свойстве Icon рассматриваемого компонента.

Обработка сообщений

Ранее  уже упоминалось, что  все  сообщения индикаторной области панели  задач пересылаются окну, поддерживаемому глобальным объектом IconMgr. Такой  объект создается и освобождается в разделах initialization и finalization модуля дан ного компонента, как показано в приведенном ниже фрагменте кода.

initialization

{ Получить уникальный идентификатор сообщения Windows для

обратного вызова из панели задач. }

DDGM_TRAYICON := RegisterWindowMessage(TrayMsgStr);

IconMgr := TIconManager.Create;

finalization

IconMgr.Free;

Этот относительно небольшой объект определен следующим образом:

type

TIconManager = class

private

FHWindow: HWnd;

procedure TrayWndProc(var Message: TMessage);

public

constructor Create;

destructor Destroy; override;

property HWindow: HWnd read FHWindow write FHWindow;

end;

Окно, которому будут отсылаться сообщения панели задач, создается в конструк

торе данного объекта с помощью  функции AllocateHWnd():

constructor TIconManager.Create;

begin

FHWindow := AllocateHWnd(TrayWndProc);

end;

Метод TrayWndProc() выступает в роли  процедуры окна для окна,  создаваемого в конструкторе. Более  подробная информация об этом  методе  приведена далее  в на стоящей главе.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии