Системный трей

Вопросы программирования и использования MSEide + MSEgui.

Модератор: Модераторы

Ответить
Аватара пользователя
coyot.rush
постоялец
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

Системный трей

Сообщение coyot.rush »

Немного погуглив по теме системный трей на шел прмерчик для Delphi, в связи счем возникли вопросы
Пример

Код: Выделить всё

procedure TForm1.ActionIcon(n:Integer;Icon:TIcon);
uses ShellApi;
................
Var Nim:TNotifyIconData;
begin
With Nim do // Заполняем структуру Nim….
Begin
cbSize:=SizeOf(Nim); // Размер
Wnd:=Form1.Handle; // Хендл нашего приложения(окна)
uID:=1;
uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
hicon:=Icon.Handle; // Хендл передаваемой в процедуру иконки
uCallbackMessage:=wm_user+1;
szTip:='Сообщение появляющееся при наведении';
End;
Case n OF // Действия выполняемые процедурой
1: Shell_NotifyIcon(Nim_Add,@Nim);
2: Shell_NotifyIcon(Nim_Delete,@Nim);
3: Shell_NotifyIcon(Nim_Modify,@Nim);
End;
end


Вопросы

Код: Выделить всё

Wnd:=Form1.Handle;
<< В MSE вроде тагже? Но это не главное

Код: Выделить всё

hicon:=Icon.Handle; 
// Хендл передаваемой в процедуру иконки
Вотт тут и проблема как засунуть в бинарник иконку(и) загрузить её и получить хендл
Оригинал статьи http://www.xakep.ru/post/28407/default.asp
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

>
> viewtopic.php?t=5074&view=unread#unread
>
> ?
The window handle of the form can be accessed by twidget.window.winid.
In order to hook into system messages use
tguiapplication.registersyseventhandler() / unregistersyseventhandler(),
needs MSEide+MSEgui SVN trunk.

Martin
Аватара пользователя
coyot.rush
постоялец
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

Сообщение coyot.rush »

с хэнделом окна вроде всё понятно. А с иконкой как быть?
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

var
i:integer;
large,small :hicon;
nicons :integer;
can:tcanvas;
bit,bit2:tmaskedbitmap;
im:imagety;
begin
bit:=tmaskedbitmap.create(true);
timage1.bitmap:=bit;
nicons:=ExtractIconEx(pchar(xx),-1,large,small,1);
//for i:=0 to nicons-1 do
//begin
ExtractIconEx(pchar(xx),0,large,small,1);
if large<>0 then
begin timage1.bitmap.size:= makesize(64,64);
timage1.bitmap.init(cl_0);

drawiconex
(timage1.bitmap.canvas.gchandle,0,0,large,16,16,0,0,DI_NORMAL);

// timagelist2.height:=16;
//timagelist2.width:=16;
// timage1.bitmap.pixels[0,0]
//timage1.bitmap.size:= makesize(16,16);
// timage1.bitmap.savetoimage(im);
//im.size:= makesize(64,64);


// timage1.bitmap.loadfromimage(im);
self.timagelist2.addimage(timage1.bitmap);

self.tdataicon1.imagelist:= self.timagelist2;
// timagelist2.size:=makesize(16,16) ;
// timagelist2.height:=16;
// timagelist2.width:=16;
//tdataicon1.imagenums.count:=1 ;
//tdataicon1.imagenums.items[0]:=0;
tdataicon1.gridvalue[0]:=0;
// tdataicon1(SELF.twidgetgrid1.datacols[0].editwidget).gridvalue[0]:=0;

//
tdataimage1(SELF.twidgetgrid1.datacols[0].editwidget).gridvalue[0]:=timage1.bitmap.;
// tdataimage1.bitmap.size:= makesize(32,32);
//tdataimage1.bitmap.init(cl_0);
// tdataimage1.bitmap.savetoimage(@im);

//showmessage(timage1.bitmap.savetoimagebuffer())
//tdataimage1.format:='ico';
// tdataimage1.gridvalue[0]:=string(@im) ;
// drawicon(tdataimage1.bitmap.canvas.gchandle,0,0,large);
destroyicon(large);
end;
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

На закладке "Exp" готов новый компонент TTrayWidget - он предоставляет значок в системном трее рядом с часами.
Работает и Выни, и в Линухе. Просьба к пользователям не-мэйнстримовых менеджеров окон (Xfce, IceWM, ...), представляющих системный трэй - протестирвать 1) рисуется ли значок вообще, 2) работает ли тестовая подсказка при наведении мыши, 3) отображается ли меню правой кнопки,..

Нюансы:
- использует ImageList для загрузки нескольких значков и переключения их в рантайме
- popup рисует свой, а не средствами Выни
- выневая версия ограничена используемым небогатым сервисом ShellNotify, а вот под Линуском (с отдачей окна значка в подчинение окну трэя, но с обработкой событий окна значка в самой программе) возможны интересные вещи, типа - микро-едитбокс + микро-кпопка, представляющие микро-форму редактирования, скроллер прямо в трэе, также работают Frame-, Face- и прочие GUI-фишки.

PS:
Мартин пишет, что Gnome работает с трэем не совсем стандартно - поэтому возможны мелкие несуразности типа "значок не хочет убраться",..
rellai2
постоялец
Сообщения: 135
Зарегистрирован: 18.09.2008 11:37:45

Сообщение rellai2 »

Здорово))
А никакого визуального реактора не намечается?
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

В смыле радактора ?
Этот компонент в IDE и настраивается. ImageList заполняется через RClick=>Edit component.
rellai2
постоялец
Сообщения: 135
Зарегистрирован: 18.09.2008 11:37:45

Сообщение rellai2 »

Не, я имею ввиду что то типа Webbrowser в режиме редактирования, ну либо на худой конец RTF
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

ну либо на худой конец RTF

100% RTF еще предстоит делать в отдельный класс, потому что нынешний скоростной вариант не предоставляет посимвольную информацию о шрифте.

Из текстовых редакторов, думаю, что сейчас наиболее подходящим выглядит Design->TSyntaxEdit.
Ответить