{----------------------------------------------------------- -----------------------------}
{ユニット名:trayicon.pas/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}
{shell_notifyiconの関数のほとんどをカプセル化し、いくつかの一般的なアプリケーションを追加 /t /t}
{/t/t/t/t/t/t/t/t/t/t/t}
{使用の手順:/t/t/t/t/t/t/t/t}
{ondblclickイベントが設定されている場合、onclickの応答時間はgetdoubleclicktimeを増やします。
{それ以外の場合、オンクリックはすぐに実行されます。/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}
{当分の間、Win95シェルスタイルのみがサポートされており、新しいバージョン5.0関数が /t /tに追加されます}
{doubleclick間隔時間は、システム設定が変更されるときに更新する必要があります。/t/t/t}
{trayiconをクリックするときは、アプリケーションを前景に持って行くかどうかを設定する必要があります。/t/t/t}
{/t/t/t/t/t/t/t/t/t/t/t}
{----------------------------------------------------------- -----------------------------}
ユニットトレイコン;
インタフェース
sysutils、クラス、グラフィックス、コントロール、ウィンドウ、メッセージ、フォーム、メニューを使用します
extctrls、shellapi;
タイプ
// ========================================================= ======================================================
// ttrayiconクラス
// ========================================================= ======================================================
ttrayicon = class(tcomponent)
プライベート
fwindow:hwnd;
fhint:string;
フィコン:タイコン;
Factive:boolean;
fonclick:tnotifyevent;
fondblclick:tnotifyevent;
fpopupmenu:tpopupmenu;
fclicktimer:ttimer;
ficondata:tnotifyicondata;
手順CheckClickTimer(送信者:tobject);
手順sendtraymessage(msgid:dword; flags:uint);
手順traywndproc(var message:tmessage);
手順Setactive(const Value:boolean);
手順Seticon(const Value:Ticon);
手順Sethint(const Value:String);
手順SetPopupMenu(const Value:tpopupmenu);
保護されています
ロードされた手順;
手順通知(acomponent:tomponent;操作:トッテレーション);
公共
Constructor Create(aowner:tomponent);
破壊者はオーバーライドします。
公開
プロパティアクティブ:Boolean Read Factive Write Setactive Default False;
プロパティヒント:文字列読み取りfhint write sethint;
プロパティアイコン:ティコン読み取りfiCon write seticon;
プロパティPopupMenu:tpopupmenu read fpopupmenu write setpopupmenu;
プロパティオンクリック:tnotifyevent読み取りfonclick write fonclick;
プロパティondblclick:tnotifyevent read fondblclick write fondblclick;
終わり;
手順登録。
実装
手順登録。
始める
RegisterComponents( '' savetime ''、[ttrayicon]);
終わり;
{ttrayicon}
const
wm_callbackmessage = wm_user + 100;
手順ttrayicon.checkclicktimer(sender:tobject);
始める
fclicktimer.Enabled:= false;
割り当てられた場合(fonclick)、fonclick(self);
終わり;
constructor ttrayicon.create(aowner:tcomponent);
始める
継承されたcreate(aowner);
fwindow:= classes.allocatehwnd(traywndproc);
フィコン:= 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;
始める
アクティブ:= false;
fclicktimer.free;
ficon.free;
classes.deallocatehwnd(fwindow);
継承;
終わり;
手順ttrayicon.loaded;
始める
継承;
事実上
sendtraymessage(nim_add、nif_messageまたはnif_iconまたはnif_tip);
終わり;
手順ttrayicon.notification(acomponent:tcomponent;操作:トッテレーション);
始める
継承通知(acomponent、操作);
if(operation = opremove)および(acomponent = popupmenu)then
popupmenu:= nil;
終わり;
手順ttrayicon.sendtraymessage(msgid:dword; flags:uint);
始める
if(flags and nif_icon)<> 0 then
始める
ficon.handle = 0の場合、/t/t //アイコンが設定されていない場合は、デフォルトのアイコンを使用します
ficondata.hicon:= application.icon.handle
それ以外
ficondata.hicon:= ficon.handle;
終わり;
ficondata.uflags:= flags;
shell_notifyicon(msgid、@ficondata);
終わり;
手順ttrayicon.setactive(const value:boolean);
始める
factive:= value;
if(not(csdesingin in componentState))および
((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(csdesingin in componentState))および
((componentStateでのcsloading))and
その後、Factive
始める
sendtraymessage(nim_modify、nif_tip);
終わり;
終わり;
手順ttrayicon.seticon(const value:ticon);
始める
ficon.Assign(value);
if(factive and not(csdesingin in componentState))
sendtraymessage(nim_modify、nif_icon);
終わり;
手順ttrayicon.setpopupmenu(const value:tpopupmenu);
始める
fpopupmenu:= value;
値<> nil then value.freenotification(self);
終わり;
手順ttrayicon.traywndproc(var message:tmessage);
var
PT:tpoint;
始める
メッセージで
始める
msg = wm_callbackmessageの場合
始める
ケースlparamの
/TWM_LBUTTONDOWN:
/tbegin
/t // ondblclickイベントが設定されていない場合は、オンクリックを直接呼び出します
/tが割り当てられていない場合(fondblclick)次に
/tを開始します
/tが割り当てられている場合(fonclick)then fonclick(self);
/傾向がある
/t else //それ以外の場合は、時間を使用してダブルクリック時間が到達したかどうかを判断します
/t fclicktimer.Enabled:= true;
/傾向がある;
/TWM_LBUTTONDBLCLK:
/tbegin
/t fclicktimer.Enabled:= false;
/tが割り当てられている場合(fondblclick)then fondblclick(self);
/傾向がある;
/TWM_RBUTTONDOWN:
/tbegin
/tが割り当てられている場合(fpopupmenu)then
/tを開始します
/t setforegroundWindow(fwindow); //この文を追加する必要があります。
/t getCursorpos(PT);
/t fpopupmenu.popup(pt.x、pt.y);
/傾向がある;
/傾向がある;
終わり;
終わり
else //他のメッセージは、処理のためにWindowsに引き渡されます
結果:= defwindowproc(fwindow、msg、wparam、lparam);
終わり;
終わり;
終わり。