Вопрос
Как сделать так, чтобы моя программа свернулась в трэй и отображалась в виде значка?
Ответ
1-й вариант:
Берем и ложим на форму imagelist и popupmenu
в imagelist закидываем пару-тройку иконок
далее в раздел public записываем такой код:
public
tr_icon:ticon;
trayicon:tnotifyicondata;
// popup меню при клике на значке
procedure onmessage(var msg:tmessage);virtual;
Procedure WMGetSysCommand(var Message : TMessage); message
WM_SYSCOMMAND;
{ Public declarations }
procedure TForm1.FormCreate(Sender: TObject);
begin
fillchar(trayicon,sizeof(trayicon),0);
tr_icon:=ticon.create;
imagelist1.geticon(1,tr_icon);// здесь ты выбираешь какую иконку грузить в трей
trayicon.cbsize:=sizeof(trayicon);
trayicon.wnd:=allocatehwnd(onmessage);
trayicon.hicon:=tr_icon.handle;
trayicon.uCallbackMessage:=15;//wm_Callback_Msg;// у меня не
// получилось в те времена зарегистрировать собщение, пришлось
// изворачиваться…
strplcopy(trayicon.sztip,application.title,sizeof(trayicon.sztip)-1);
// Вместо application.title можно поставить свою
//строку, которая будет выскакивать как хинт
trayicon.uflags:=nif_message or nif_icon or nif_tip;
// процедура создания иконки
shell_notifyicon(nim_add,@trayicon);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
// удаление иконки из трея
shell_notifyicon(nim_delete,@trayicon);
end;
// обработка всплывающего окна
procedure tform1.onmessage(var msg:tmessage);
procedure showpopup;
var
x,y:integer;
begin
x:=getsystemmetrics(sm_cxfullscreen);
y:=getsystemmetrics(sm_cyfullscreen)+getsystemmetrics(sm_cycaption);
popupmenu1.popup(x,y)
end;
begin
case msg.msg of
15: case msg.LParam of
wm_lbuttondblclk :show;
// можно сделать по другому // if form1.visible=true then form1.hide else form1.show;
wm_rbuttondown:showpopup;
end;
end;
end;
// обработка минимизации окна
Procedure Tform1.WMGetSysCommand(var Message : TMessage);
Begin
IF (Message.wParam = SC_MINIMIZE)
Then form1.Visible:=False
Else Inherited;
End;
для смены иконки если не ошибаюсь надо сделать такой код:
imagelist1.geticon(1,tr_icon);// здесь ты выбираешь какую иконку
trayicon.hicon:=tr_icon.handle;
shell_notifyicon(nim_modify,@trayicon);
Нашел на бескрайних просторах, не помню где, собрано из разных кусков, но у меня работает, (в 95 винде иконки в трее не видно, но я думаю это связано как-то imagelist…)
2-й вариант:
Использовать соответствующие компоненты.
Александр
Copyright 2000-2004 Сообщество Чайников
Контактная информация