{------------------------------------------------- -----------------------------}
{Имя блока: trayicon.pas/t/t/t/t/t/t/t}
{/T/T/T/T/T/T/T/T/T/T/T/T}
{Автор блока: savetime ([email protected], http://savetime.delphhibbs.com)}
{Созданная дата: 2004-11-13 12: 20: 54/T/T/T/T/T/T/T}
{/T/T/T/T/T/T/T/T/T/T/T/T}
{Введение функции:/t/t/t/t/t/t/t/t/t}
{Инкапсулируйте большинство функций shell_notifyicon и добавьте несколько общих приложений /t /t}
{/T/T/T/T/T/T/T/T/T/T/T/T}
{Инструкции для использования:/t/t/t/t/t/t/t/t}
{Если установлено событие OndblClic
{В противном случае, OnClick будет выполнен немедленно ./T/T/T/T/T/T/T}
{Если значок не установлен, значок приложения будет использоваться ./T/T/T}
{/T/T/T/T/T/T/T/T/T/T/T/T}
{ИСТОРИЯ ОБНОВЛЕНИЯ:/T/T/T/T/T/T/T/T/T}
{Когда появляется правой кнопкой мыши меню, нажав на другое место, не может закрыть меню.
{Add: setforegroundwindow (fwindow);
{/T/T/T/T/T/T/T/T/T/T/T/T}
{Существующие задачи:/t/t/t/t/t/t/t/t/t}
{На данный момент поддерживается только стиль Shell Win95, и новая функция версии 5.0 добавлена в /T /T позже}
{DoubleClick Время интервала должно быть обновлено как изменение настройки системы ./T/T/T}
{При нажатии на Trayicon вы должны установить, чтобы принести приложение на передний план ./T/T/T}
{/T/T/T/T/T/T/T/T/T/T/T/T}
{------------------------------------------------- -----------------------------}
единица Trayicon;
интерфейс
использует Sysutils, классы, графику, управления, окна, сообщения, формы, меню,
Extctrls, shellapi;
тип
// ========================================================================== ==================================================================
// класс Ttrayicon
// ========================================================================== ==================================================================
Ttrayicon = class (tcomponent)
Частный
Fwindow: hwnd;
Fhint: string;
Фикон: Тикон;
Факт: логический;
Fonclick: tnotifyevent;
Fondblclick: tnotifyevent;
Fpopupmenu: tpopupmenu;
Fclicktimer: ttimer;
Ficondata: Tnotifyicondata;
Процедура проверка цикла (отправитель: tobject);
Процедура SendTrayMessage (MSGID: DWORD; Флаги: UINT);
Процедура traywndproc (var message: tmessage);
процедура setActive (const value: boolean);
процедура SETICON (CONST Значение: Тикон);
Процедура Sethint (const value: String);
процедура SetPopupMenu (const value: tpopupmenu);
защищен
процедура загружена;
Уведомление о процедуре (ACOMPONENT: TCOMPONENT; Операция: Топирация);
публичный
конструктор Create (AOHOWNER: TCOMPONT);
разрушитель разрушает;
опубликовано
Свойство Активное: логическое чтение Устройственное записи Setactive по умолчанию false;
Намек на свойство: строка читать fhint написать Sethint;
Значок свойства: Тикон Читать Ficon Write Seticon;
Propupmenu: Tpopupmenu читать fpopupmenu write setpopupmenu;
Собственность Onclick: TnotifyEvent Read Fonclick написать fonclick;
Собственность Ondblclick: tnotifyevent Read Fondblclick написать fondblclick;
конец;
Регистр процедур;
Выполнение
Регистр процедур;
Начинать
RegisterComponents ('' SaveTime '', [ttrayicon]);
конец;
{Ttrayicon}
констант
WM_CALLBACKMESSAGE = WM_USER + 100;
Процедура ttrayicon.checkclicktimer (отправитель: tobject);
Начинать
Fclicktimer.enabled: = false;
Если назначено (fonclick), то fonclick (self);
конец;
конструктор ttrayicon.create (Aowner: tcomponent);
Начинать
унаследованное создание (аоаллер);
Fwindow: = classe.allocatehwnd (traywndproc);
Ficon: = ticon.create;
Fclicktimer: = ttimer.create (self);/t // таймер, который обрабатывает щелчок и дважды щелкните интервалы
Fclicktimer.enabled: = false;
Fclicktimer.interval: = getDoubleClicktime;
Fclicktimer.ontimer: = checkclicktimer;
Ficondata.cbsize: = sizeof (ficondata);/t // инициализируйте структуру notifyicondata
Ficondata.wnd: = fwindow;
Ficondata.uid: = uint (self);
Ficondata.ucallbackmessage: = wm_callbackmessage;
конец;
деструктор ttrayicon.destroy;
Начинать
Active: = false;
Fclicktimer.free;
Ficon.free;
Classes.DealLocateHwnd (fwindow);
унаследован;
конец;
Процедура ttrayicon.laded;
Начинать
унаследован;
Если факт, тогда
SendTrayMessage (nim_add, nif_message или nif_icon или nif_tip);
конец;
Процедура ttrayicon.notification (Acomponent: Tcomponent; Операция: Топирация);
Начинать
унаследованное уведомление (Acomponent, Operation);
if (Operation = OpreMove) и (ACOMPONENT = POPUPMENU) тогда
POPUPMENU: = NIL;
конец;
Процедура ttrayicon.sendtraymessage (msgid: dword; флаги: uint);
Начинать
if (flags и nif_icon) <> 0 тогда
Начинать
Если ficon.handle = 0, то/t/t // Если значок не установлен, используйте значок по умолчанию
Ficondata.hicon: = Application.icon.handle
еще
Ficondata.hicon: = ficon.handle;
конец;
Ficondata.uflags: = flags;
Shell_notifyicon (msgid, @ichondata);
конец;
Процедура ttrayicon.setactive (const value: boolean);
Начинать
Факт: = значение;
if (не (csdesigning in componentstate)) и
(не (csloading in componentState)) тогда
Начинать
Если значение, тогда
SendTrayMessage (nim_add, nif_message или nif_icon или nif_tip)
еще
SendTrayMessage (nim_delete, 0)
конец;
конец;
Процедура ttrayicon.sethint (const value: string);
Начинать
Fhint: = value;
Strplcopy (ficondata.sztip, pchar (fhint), sizeof (ficondata.sztip));
if (не (csdesigning in componentstate)) и
(не (csloading in componentState)) и
Факт тогда
Начинать
SendTrayMessage (nim_modify, nif_tip);
конец;
конец;
Процедура ttrayicon.seticon (const value: ticon);
Начинать
Ficon.assign (значение);
if (фактическое и не (csdesigning in componentstate)), тогда
SendTrayMessage (nim_modify, nif_icon);
конец;
Процедура ttrayicon.setPopupMenu (const value: tpopupmenu);
Начинать
Fpopupmenu: = value;
Если значение <> nil, то value.freenotification (self);
конец;
Процедура ttrayicon.traywndproc (var Сообщение: tmessage);
вар
PT: Tpoint;
Начинать
с сообщением
Начинать
Если msg = wm_callbackmessage, тогда
Начинать
Дело LPARAM OF
/twm_lbuttondown:
/tbegin
/t // Если событие OndblClick не установлено, вызовите Onclick напрямую
/t, если не назначено (fondblclick), тогда
/t начинается
/t, если назначено (fonclick), то fonclick (self);
/иметь тенденцию
/t else // в противном случае используйте время, чтобы определить, достигло ли двойного клика время
/t fclicktimer.enabled: = true;
/иметь тенденцию;
/twm_lbuttondblclk:
/tbegin
/t fclicktimer.enabled: = false;
/t, если назначено (fondblclick), то Fondblclick (self);
/иметь тенденцию;
/twm_rbuttondown:
/tbegin
/t, если назначено (fpopupmenu), тогда
/t начинается
/t SetforegroundWindow (fwindow);
/t getCursorpos (Pt);
/t fpopupmenu.popup (pt.x, pt.y);
/иметь тенденцию;
/иметь тенденцию;
конец;
конец
else // другие сообщения передаются Windows для обработки
Результат: = defWindowProc (FWINDOW, MSG, WPARAM, LPARAM);
конец;
конец;
конец.