Компоненты Rave Reports и отчеты в приложении Delphi

       

Размещение значка приложения на System Tray



Размещение значка приложения на System Tray

Часто программисту приходится сталкиваться с задачей написания приложения, работающего в фоновом режиме и не нуждающегося в месте на Панели задач. Если вы посмотрите на правый нижний угол рабочего стола Windows, то наверняка найдете там приложения, для которых эта проблема решена: часы, переключатель раскладок клавиатуры, регулятор громкости и т. п. Ясно, что, как бы вы не увеличивали и не уменьшали формы своего приложения, попасть туда обычным путем не удастся. Способ для этого предоставляет Shell API.

Те картинки, которые находятся на System Tray — это действительно просто картинки, а не свернутые окна. Они управляются и располагаются панелью System Tray. Она же берет на себя еще две функции: показ подсказки для каждого из значков и оповещение приложения, создавшего значок, обо всех перемещениях мыши над ним.

Весь API System Tray состоит из 1 (одной) функции:

function Shell_NotifyIcon(dwMessage: DWORD;



IpData: PNotifylconData): BOOL; PNotifylconData = TNotifylconData; TNotifylconData = record

cbSize: DWORD;

Wnd: HWND;

uID: UINT;

uFlags: UINT;

uCallbackMessage: UINT;

hlcon: HICON;

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

end;

Параметр dwMessage определяет одну из операций: NIM_ADD означает добавление значка в область, NIM_DELETE — удаление, NIM_MODIFY — изменение.

Ход операции зависит от того, какие поля структуры TNotifyiconData будут заполнены.

Обязательным для заполнения является поле cbsize — там содержится размер структуры. Поле wnd должно содержать дескриптор окна, которое будет оповещаться о событиях, связанных со значком. Идентификатор сообщения Windows, которое вы хотите получать от системы о перемещениях мыши над значком, запишите в поле uCallbackMessage. Если вы хотите, чтобы при этих перемещениях над вашим значком показывалась подсказка, то задайте ее текст в поле szTip. В поле UID задается номер значка — каждое приложение может поместить на System Tray сколько угодно значков. Дальнейшие операции вы будете производить, задавая этот номер. Дескриптор помещаемого значка должен быть задан в поле hIcon. Здесь вы можете задать значок, связанный с вашим приложением, или загрузить свой — из ресурсов.

Примечание
Примечание

Изменить главный значок приложения можно в диалоговом окне Project/ Options на странице Application. Он будет доступен через свойство Application.Icon. Тут же можно отредактировать и строку для подсказки — свойство Application.Title.

Наконец, в поле uFlags вы должны сообщить системе, что именно вы от нее хотите, или, другими словами, какие из полей hicon, uCaiibackMessage и szTip вы на самом деле заполнили. В этом поле предусмотрена комбинация трех флагов: NIF_ICON, NIF_MESSAGE и NIF_TIP. Вы можете заполнить, скажем, поле szTip, но если вы при этом не установили флаг NIF_TIP, созданный вами значок не будет иметь строки с подсказкой.

Два приведенных ниже метода иллюстрируют сказанное. Первый из них создает значок на System Tray, а второй — уничтожает его.

const WM_MYTRAYNOTIFY = WMJJSER + 123;

procedure TForml.CreateTraylcon(n:Integer); 

var nidata : TNotifyiconData;

begin

with nidata do 

begin

cbSize := SizeOf{TNotifyiconData) ;

Wnd := Self.Handle;

uID := n;

uFiags := NIF_ICON or NIF_MESSAGE or NIFJTIP;

uCallBackMessage := WM_MYTRAYNOTIFY;

hicon := Application.Icon.Handle;

szTip := 'THis is Traylcon Example'; 

end;

Shell_NotifyIcon(NIM_ADD, @nidata); 

end;

procedure TForml.DeleteTraylcon(n:Integer); 

var nidata : TNotifylconData; begin

with nidata do

begin

cbSize := SizeOf(TNotifylconData);

 Wnd := Self.Handle; uID := n; end;

Shell_NotifyIcon(NIM_DELETE, @nidata);

end;

Примечание
Примечание

He забывайте уничтожать созданные вами значки на System Tray. Это не делается автоматически даже при закрытии приложения. Значок будет удален только после перезагрузки системы.

Внешний вид значка, помещенного нами на System Tray, ничем не отличается от значков других приложений (Рисунок 31.1).



Содержание раздела