СообЧа > База Знаний > Программирование > Delphi

Вопрос

Как сделать так, чтобы моя программа свернулась в трэй и отображалась в виде значка?

Ответ

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 Сообщество Чайников
Контактная информация