{------------------------------------------------- -----------------------------}
{Nama unit: trayicon.pas/t/t/t/t/t/t/t}
{/t/t/t/t/t/t/t/t/t/t/t/t}
{Unit Author: Savetime ([email protected], http://savetime.delphhibbs.com)}
{Tanggal dibuat: 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}
{Function Pendahuluan:/t/t/t/t/t/t/t/t/t}
{Encapsulate Sebagian besar fungsi shell_notifyicon dan tambahkan beberapa aplikasi umum /t /t}
{/t/t/t/t/t/t/t/t/t/t/t/t}
{Instruksi untuk digunakan:/t/t/t/t/t/t/t/t}
{Jika acara OndBlClick ditetapkan, waktu respons OnClick akan meningkatkan GetDoubleclickTime.
{Jika tidak, OnClick akan segera dieksekusi./t/t/t/t/t/t/t}
{Jika ikon tidak diatur, ikon aplikasi akan digunakan./t/t/t}
{/t/t/t/t/t/t/t/t/t/t/t/t}
{Update History:/t/t/t/t/t/t/t/t/t}
{Ketika menu klik kanan muncul, mengklik lokasi lain tidak dapat menutup menu.
{Add: setForeGroundWindow (fwindow); sebelum menu pop-up ditampilkan./t/t}
{/t/t/t/t/t/t/t/t/t/t/t/t}
{Masalah yang ada:/t/t/t/t/t/t/t/t/t}
{Untuk saat ini, hanya gaya win95 shell yang didukung, dan fungsi versi 5.0 baru ditambahkan ke /t /t nanti}
{DoubleClick Time Interval harus diperbarui sebagai pengaturan sistem perubahan./t/t/t}
{Saat mengklik Trayicon, Anda harus mengatur apakah akan membawa aplikasi ke latar depan./t/t/t}
{/t/t/t/t/t/t/t/t/t/t/t/t}
{------------------------------------------------- -----------------------------}
unit trayicon;
antarmuka
menggunakan sysutils, kelas, grafik, kontrol, jendela, pesan, formulir, menu,
Extctrls, shellapi;
jenis
// =================================================== ==========================================
// Kelas Ttrayicon
// =================================================== ==========================================
Ttrayicon = kelas (tComponent)
Pribadi
Fwindow: hwnd;
FHint: string;
Ficon: Ticon;
Faktif: Boolean;
Fonclick: tnotifyevent;
FondblClick: tnotifyevent;
Fpopupmenu: tpopupmenu;
FClickTimer: timer;
Ficondata: tnotifyicondata;
Prosedur CheckClickTimer (Pengirim: Tobject);
Prosedur sendtraymessage (msgid: dword; bendera: uint);
Prosedur TraywndProc (Pesan Var: TMessage);
Prosedur SetActive (Const Value: Boolean);
prosedur seticon (nilai const: ticon);
Prosedur SetHint (Const Value: String);
prosedur setpopupmenu (nilai const: tpopupmenu);
terlindung
prosedur dimuat;
Pemberitahuan Prosedur (Acomponent: TComponent; Operasi: Toperasi);
publik
Constructor Create (Aowner: TComponent);
Destructor menghancurkan;
diterbitkan
Properti Aktif: Boolean Read Factive Write SetActive Default False;
Petunjuk Properti: String Baca FHint Write Sethint;
Ikon Properti: Ticon Baca Ficon Write Seticon;
properti popupmenu: tpopupmenu baca fpopupmenu tulis setpopupmenu;
Property OnClick: tnotifyEvent baca fonClick write fonclick;
Properti ondblClick: tnotifyEvent Baca fondblClCLCK Tulis fondblClick;
akhir;
register prosedur;
Pelaksanaan
register prosedur;
Mulai
RegisterComponents ('' SaveTime '', [ttrayicon]);
akhir;
{Ttrayicon}
const
Wm_callbackmessage = wm_user + 100;
Prosedur ttrayicon.checkClickTimer (pengirim: tobject);
Mulai
FClickTimer.enabled: = false;
jika ditugaskan (fonclick) maka fonclick (self);
akhir;
konstruktor ttrayicon.create (aowner: tcomponent);
Mulai
warisan create (aowner);
Fwindow: = class.allocehwnd (traywndproc);
Ficon: = ticon.create;
FClickTimer: = ttimer.create (self);/t // timer yang menangani interval klik dan klik dua kali
FClickTimer.enabled: = false;
FClickTimer.Interval: = getDoubleclicktime;
Fclicktimer.ontimer: = checkClickTimer;
Ficondata.cbsize: = sizeof (ficondata);/t // inisialisasi struktur notifyicondata
Ficondata.wnd: = fwindow;
Ficondata.uid: = uint (self);
Ficondata.ucallbackMessage: = wm_callbackmessage;
akhir;
Destructor ttrayicon.destroy;
Mulai
Aktif: = false;
FClickTimer.Free;
Ficon.free;
Class.deallocehwnd (fwindow);
diwariskan;
akhir;
Prosedur ttrayicon.Loaded;
Mulai
diwariskan;
Jika factive maka
Sendtraymessage (nim_add, nif_message atau nif_icon atau nif_tip);
akhir;
Prosedur Ttrayicon.Notification (Acomponent: TComponent; Operasi: Toperasi);
Mulai
pemberitahuan yang diwariskan (Acomponent, Operation);
if (operasi = opremove) dan (acomponent = popupmenu)
Popupmenu: = nil;
akhir;
Prosedur ttrayicon.sendtraymessage (msgid: dword; bendera: uint);
Mulai
if (flags dan nif_icon) <> 0 lalu
Mulai
Jika ficon.handle = 0 lalu/t/t // Jika ikon tidak diatur, gunakan ikon default
Ficondata.hicon: = application.icon.handle
kalau tidak
Ficondata.hicon: = ficon.handle;
akhir;
Ficondata.uflags: = bendera;
Shell_notifyicon (msgid, @ficondata);
akhir;
Prosedur ttrayicon.setActive (nilai const: boolean);
Mulai
Faktif: = nilai;
if (not (csdesigning in componentstate) dan dan
(bukan (csloading di ComponentState)) kemudian
Mulai
Jika nilai itu
Sendtraymessage (nim_add, nif_message atau nif_icon atau nif_tip)
kalau tidak
Sendtraymessage (nim_delete, 0)
akhir;
akhir;
Prosedur ttrayicon.sethint (nilai const: string);
Mulai
FHint: = nilai;
StrplCopy (ficondata.sztip, pchar (fHint), sizeof (ficondata.sztip));
if (not (csdesigning in componentstate) dan dan
(bukan (csloading di ComponentState)) dan
Faktif kemudian
Mulai
Sendtraymessage (nim_modify, nif_tip);
akhir;
akhir;
Prosedur ttrayicon.seticon (nilai const: ticon);
Mulai
Ficon.assign (nilai);
Jika (Faktif dan Tidak (CSDesigning di ComponentState))
Sendtraymessage (nim_modify, nif_icon);
akhir;
Prosedur ttrayicon.setpopupmenu (nilai const: tpopupmenu);
Mulai
Fpopupmenu: = nilai;
jika nilai <> nil maka value.freenotification (self);
akhir;
Prosedur ttrayicon.traywndproc (pesan var: tmessage);
var
Pt: tpoint;
Mulai
dengan pesan lakukan
Mulai
Jika msg = wm_callbackmessage maka
Mulai
kasus lparam dari
/twm_lbuttondown:
/tbegin
/t // Jika acara OndBlClick tidak diatur, hubungi OnClick secara langsung
/t jika tidak ditugaskan (fondBlClick) lalu
/t mulai
/t jika ditugaskan (fonClick) kemudian fonClick (self);
/cenderung
/t lain // Sebaliknya, gunakan waktu untuk menentukan apakah waktu klik dua kali
/t fclickTimer.enabled: = true;
/cenderung;
/twm_lbuttondblclk:
/tbegin
/t fclickTimer.enabled: = false;
/t jika ditugaskan (fondBlClick) kemudian fondBlClick (self);
/cenderung;
/twm_rbuttondown:
/tbegin
/t jika ditugaskan (fpopupmenu) lalu
/t mulai
/t setForegroundWindow (fwindow);
/t getCursorpos (PT);
/t fpopupmenu.popup (pt.x, pt.y);
/cenderung;
/cenderung;
akhir;
akhir
lain // pesan lain diserahkan ke windows untuk diproses
Hasil: = DefWindowProc (FWindow, MSG, WPARAM, LPARAM);
akhir;
akhir;
akhir.