{--------------------------------------------------------- -----------------------------}
{단위 이름 : trayicon.pas/t/t/t/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/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/t/t/t}
{ondblClick 이벤트가 설정되면 OnClick의 응답 시간이 getDoubleClickTime을 증가시킵니다.
{그렇지 않으면 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/t/t/t}
{오른쪽 클릭 메뉴가 나타나면 다른 위치를 클릭하면 Solution :/T/T/T}.
{추가 : Setforegroundwindow (fwindow);
{/t/t/t/t/t/t/t/t/t/t/t/t/t/t}
{기존 문제 :/t/t/t/t/t/t/t/t/t/t}
{당분간 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/t/t}
{--------------------------------------------------------- -----------------------------}
단위 트레이시콘;
인터페이스
sysutils, 클래스, 그래픽, 컨트롤, 창, 메시지, 양식, 메뉴를 사용합니다.
extctrls, shellapi;
유형
// ================================================ =======================================
// ttrayicon 클래스
// ================================================ =======================================
ttrayicon = class (tcomponent)
사적인
Fwindow : HWND;
fhint : 문자열;
Ficon : Ticon;
사실 : 부울;
fonclick : tnotifyevent;
fondblclick : tnotifyevent;
fpopupmenu : tpopupmenu;
Fclicktimer : Ttimer;
Ficondata : tnotifyicondata;
절차 checkClicktimer (sender : tobject);
절차 sendTrayMessage (msgid : dword; flags : uint);
절차 traywndproc (var 메시지 : tmessage);
절차 setActive (const 값 : 부울);
절차 seticon (const 값 : Ticon);
절차 sethint (const value : String);
절차 setpopupmenu (const 값 : tpopupmenu);
보호
로드 된 절차;
절차 알림 (Acomponent : tcomponent; Operation : Toperation);
공공의
생성자 생성 (aowner : tcomponent);
소멸자 파괴;
게시
속성 활성 : 부울 읽기 사실 쓰기 setActive 기본 거짓;
속성 힌트 : 문자열 읽기 fhint write sethint;
속성 아이콘 : Ticon Read Ficon Write Seticon;
Property PopupMenu : tpopupmenu 읽기 fpopupmenu write setpopupmenu;
속성 onclick : tnotifyevent 읽기 fonclick write fonclick;
속성 ondblclick : tnotifyevent 읽기 fondblclick write fondblclick;
끝;
절차 레지스터;
구현
절차 레지스터;
시작하다
RegisterComponents ( ''savetime '', [ttrayicon]);
끝;
{ttrayicon}
Const
wm_callbackmessage = wm_user + 100;
절차 ttrayicon.checkclicktimer (sender : tobject);
시작하다
fclicktimer.enabled : = false;
할당 된 경우 (Fonclick) Fonclick (self);
끝;
생성자 ttrayicon.create (aowner : tcomponent);
시작하다
상속 된 Create (Aowner);
fwindow : = classe.allocationhwnd (traywndproc); // trayicon 메시지를 처리합니다
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;
끝;
Destructor ttrayicon.destroy;
시작하다
활성 : = 거짓;
fclicktimer.free;
ficon.free;
classs.deallocehwnd (fwindow);
상속;
끝;
절차 ttrayicon.loaded;
시작하다
상속;
그렇다면 사실이라면
SendTrayMessage (nim_add, nif_message 또는 nif_icon 또는 nif_tip);
끝;
절차 ttrayicon. nontification (Acomponent : tcomponent; Operation : Toperation);
시작하다
상속 알림 (Acomponent, Operation);
if (Operation = OpreMove) 및 (Acomponent = PopuPmenu) 그러면
PopupMenu : = nil;
끝;
절차 ttrayicon.sendtraymessage (msgid : dword; flags : uint);
시작하다
if (flags and nif_icon) <> 0
시작하다
ficon.handle = 0 인 경우/t/t // 아이콘이 설정되지 않은 경우 기본 아이콘을 사용하십시오.
ficondata.hicon : = application.icon.handle
또 다른
ficondata.hicon : = ficon.handle;
끝;
ficondata.uflags : = 깃발;
shell_notifyicon (msgid, @ficondata);
끝;
절차 ttrayicon.setActive (const 값 : 부울);
시작하다
사실 : = 값;
if (not (componentState에서 csdesigning)) 및
(ComponentState에서 CSLOADING)
시작하다
그렇다면 가치가 있다면
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 (not (componentState에서 csdesigning)) 및
(NOT (componentState에서 CSLOWED)) 및
그렇다면 사실
시작하다
SendTrayMessage (nim_modify, nif_tip);
끝;
끝;
절차 ttrayicon.seticon (const 값 : Ticon);
시작하다
ficon.assign (값);
if (factive and not (componentstate에서 csdesigning))
SendTrayMessage (nim_modify, nif_icon);
끝;
절차 ttrayicon.setpopupmenu (const 값 : tpopupmenu);
시작하다
fpopupmenu : = value;
value <> nil이면 value.freenotification (self);
끝;
절차 ttrayicon.traywndproc (var 메시지 : tmessage);
var
PT : tpoint;
시작하다
메시지와 함께
시작하다
msg = wm_callbackmessage라면
시작하다
사례 lparam
/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);
끝;
끝;
끝.