![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не получается добавить значек в трей.
Ego © (2004-12-20 08:37:00)Здравствуйте, всем.Я пытаюсь добавить пиктограмму в панель резидентов:
..
const MyTryIcon = WM_USER+1;
..
uses Unit2, Unit3, Unit4, ShellAPI;
var NID : TNotifyIconData;
..
procedure TForm1.FormCreate(Sender: TObject);
begin
SetWindowRgn(handle,CreateRoundRectRgn(0,0,width,height,30,30),true);
with NID do
begin
cbSize:=SizeOf(TNotifyIconData);
Wnd:=Handle;
uId:=1;
uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
uCallbackMessage:=MyTryIcon;
hIcon:=Application.Icon.Handle;
szTip:='';
end;
Shell_NotifyIcon(NIM_ADD,@Icon);
end;
Происходит следующее: после выполнения Shell_NotifyIcon в трее выделяется место, но иконка не появляется и трей сразу возвращается в исходное состояние - без моего значка...Подскажите, пожалуйста, в чем я ошибаюсь?
Piter (2005-02-14 19:32:00) [1]sniknik © (14.02.05 1:57) [37]
дело в том что я про это вобще не думал при ответе, тем более до этого
подожди. Какая разница о чем ты думал? :)
Ты сказал:
sniknik © (12.02.05 23:37) [32]
может дополнительно регистрить окно надо
что значит дополнительно и может? Окно регистрировать надо по любому, а не может!
Grief (2005-02-14 07:26:00) [2]Озарение было сразу, но написать ответ пришло не сразу....
sniknik (2005-02-14 01:57:00) [3]> ни фига себе угадал...
угадал угадал. ;о)) дело в том что я про это вобще не думал при ответе, тем более до этого > [31] было сказано, окно есть и его видно на экране... т.е. все ок.
т.что про нее я сказал наугад, на всякий случай.
Piter (2005-02-13 22:16:00) [4]О нуле я написал еще в 12.02.05 16:28
И больше дня потребовалось, чтобы проверить это! И только в 13.02.05 22:11 озарение.
Отпадает всякое желание помогать вообще.
Grief (2005-02-13 22:11:00) [5]Ой, товарищи мастера, я сожалею, что нагнал здесь всякой пурги, но дело в том, что я просто банально недоглядел... этож надо, вызывать InitializeTray раньше, чем CreateWindowEx, of course handle = 0!!! Ламер я, ой ламер, пора уходить на пенсию))))
Piter (2005-02-13 21:42:00) [6]sniknik © (13.02.05 14:32) [33]
т.е. про регистрацию я угадал
ни фига себе угадал... А как ты еще создащь окно какого-то класса (не стандартного), если не зарегистрируешь его?!
Какое тут блин гадание...
sniknik (2005-02-13 14:32:00) [7]> да мало ли еще что, неохота вникать.
не выдержал, проверил ;о)), сделал на "чистом" winapi форму (вернее переделал имеющийся пример, "усек" его по размеру), передал ее хендл значку... как и ожидалось работает.
у тебя точно чтото не то с созданным окном, показал бы все, как создаеш, а то одна приведенная тобой функция не может быть, она возвращает 0.
в примере (моем) кроме этого регистрится класс окна (т.е. про регистрацию я угадал ;), а вот специальных событий не нужно (стандартный обработчик только). и WS_Popup это случаем не окно для всплываюхих менюшек? вряд ли оно тогда подойдет (хотя, не знаю, может и подойдет, проверять опять ломает ;) просто логически, не для того оно).
sniknik (2005-02-12 23:37:00) [8]значит чтото не то туда пишеш, вот попробуй вышепреведенный пример там где от стандартного окна Form1.Handle вносится, не будет изчезать.
а у тебя, х.з, может действительно 0 возврашает (хотя если окно видно, то не должно ошибки вроде нет), может дополнительно регистрить окно надо, либо в обрабочик событий "ответ" системе вставлять. да мало ли еще что, неохота вникать.
Grief (2005-02-12 23:06:00) [9]Существует, см выше, я его не убиваю... оно даже на экране есть.
sniknik (2005-02-12 22:44:00) [10]> а когда на нее курсор наводишь - исчезает.
100% хендла не сушествует,
к примеру если нормальное приложение "срубить" так чтобы оно не успело свою иконку снять, ее снимет система при проводке над иконкой мышиным курсором.
у тебя видимо окна изначально не сушествует/другой хендл пишеш/окно уничтожаеш после создания иконки в обшем несответствие.
> а что сделать можно?
окно, чей хендл используется, должно существовать все время пока иконка используется.
Grief (2005-02-12 22:11:00) [11]>Чему равно MainWnd после вызова CreateWindowEx? Не ноль, случайно?
Возможно... до меня доходит.... а что сделать можно?
Eraser (2005-02-12 20:56:00) [12]Piter ©
Написать код для помещения иконки в трей - дело минуты.
Нельзя не согласиться. Но когда необходимо "прикрутить" к этой иконки менюшку, обработку различных кликов различными кнопками, анимацию, baloon hint и т.д. эта задача выливается в немаленнький код с кучей патенциальных дыр.
Так вот, ИМХО, лучше энтузиазм тратить на более полезные вещи, чем на копирование RxLib и JEDI VCL, опять же имхо...
Piter (2005-02-12 16:28:00) [13]Eraser © (12.02.05 11:50) [26]
Всё равно всё закончиться установкой готовых компонентов...имхо.
вот именно, что имхо. Написать код для помещения иконки в трей - дело минуты. Ставить для этого какие-то компоненты...
Grief © (12.02.05 9:45) [25]
MainWn
Чему равно MainWnd после вызова CreateWindowEx? Не ноль, случайно?
Eraser (2005-02-12 11:50:00) [14]Ego
Всё равно всё закончиться установкой готовых компонентов...имхо.
Так что советую JEDI VCL.
Grief (2005-02-12 09:45:00) [15]У меня вопрос есть, имитирую: сделал все как надо, а потом... а потом - ничего, в трее появляется еще одна иконка, а когда на нее курсор наводишь - исчезает. В качестве NotifyIconData.WND я использую окно, созданное
MainWnd:=CreateWindowEx(WS_EX_AcceptFiles, 'WinMin : Main', 'The Launcher', WS_Popup, CW_USEDEFAULT, CW_USEDEFAULT, Display.Width, Display.Height, 0, 0, Hinstance, nil);
Почему так?
P.S. Лучше использовать не WM_USER (может быть конфликт) а RegisterWindiwMessage
grom (2005-01-08 18:17:00) [16]http://www.delphimaster.ru/cgi-bin/forum.pl?id=1104563793&n=0
Piter (2005-01-08 18:15:00) [17]VMcL © (08.01.05 16:55) [21]
Клиент глючит?
да не туда ткнул просто :)
Есть у него такая особенность...
Eraser (2005-01-08 17:00:00) [18]В нете полно готовых рабочих компонентов. torry.ru например
VMcL (2005-01-08 16:55:00) [19]>> Piter © (08.01.05 16:51) [20]
[offtopic]
Клиент глючит?
[/offtopic]
Piter (2005-01-08 16:51:00) [20]VMcL © (08.01.05 10:11) [18]
И как мне сделать чтобы заработало ?
определить процедуру с messageу метода класса (у формы, например)?