Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Текст вместо иконки


Автор: PavelPro 5.4.2005, 17:26
Как сделать чтобы вместо иконки в трее показывалася строка? smile
И все это надо с помощью Shell_NotifyIcon smile

Автор: _hunter 5.4.2005, 17:37
строка -- никак. можно пару букв всунуть...

Автор: PavelPro 5.4.2005, 18:00
Нужно чтоб вместо иконки показывался текст а не на иконке! smile

Автор: Snowy 5.4.2005, 18:07
Читай статью про трей.
Принцип действия - создаешь свою иконку из битмапа.
То есть создаешь битмап, рисуешь на нем текст, конвертишь в иконку.
А уже эту иконку назначаешь в трей.

Автор: _hunter 5.4.2005, 18:28
PavelPro, что тебе нужно я понял. только сделать этого нельзя...
можно бегущую строку сделать ( по одной букве показывать )
Snowy, максимальная иконка для трея 64х64 ( кажись ) какого размера будут буквы у такого текта? ;)

Автор: Snowy 5.4.2005, 18:51
Цитата(_hunter @ 5.4.2005, 18:28)
Snowy, максимальная иконка для трея 64х64 ( кажись ) какого размера будут буквы у такого текта? ;)

Наверняка сказать не могу, но насколько мне известно, в качестве "иконки" можно назначать глифы и большего размера.
Я этим не интересовался, но можно просто найти статью "как запихать текст в трей".

Автор: ~FoX~ 6.4.2005, 07:46
Гы........странные вы все.
В трей можно засунуть все что угодно...........
http://sources.ru/vb/put_form_in_systray.jpg
Вот исходник, правда он на VB, но думаю, это не проблема.
http://sources.ru/vb/put_form_in_systray.zip

Автор: Poseidon 6.4.2005, 12:15
Цитата(Snowy @ 5.4.2005, 18:07)
Читай статью про трей.
Принцип действия - создаешь свою иконку из битмапа.
То есть создаешь битмап, рисуешь на нем текст, конвертишь в иконку.
А уже эту иконку назначаешь в трей.
Вот эта статья: http://vingrad.ru/DELPHI-DLP-000643

PS. Нужно иногда в FAQ заглядывать!

Автор: Guest 6.4.2005, 13:40
Да я пробовал вариант показаный в FAQ ,не помогло!
smile

Автор: _hunter 6.4.2005, 14:14
Poseidon, перед тем, как что-то советуеш, нужно это самому попробовать сделать...

~FoX~, ты описание читал?
Цитата
'This makes the systray larger (length wise) by simply adding more "Ghost" _
or foney icons to the tray.  This is the easyest way I could find to enlarging _
the system tray.

Автор: ~FoX~ 6.4.2005, 15:09
_hunter
Не понял....

Автор: _hunter 6.4.2005, 15:35
этот пример не вставляет текст в трей. он создает тучу иконок на каждой из которых рисует по букве...

Автор: Girder 6.4.2005, 16:57
Вот тебе пример... увеличения области под иконку(в данном примере... для всех иконок из трея):
Код
...
var
  Form1: TForm1;
  TrayWnd:Cardinal; //Shell_TrayWnd - Панель задач
  TrayNW:Cardinal; //TrayNotifyWnd - Весь трей
  TrayButton:Cardinal; //Button - Кномка для показа/скрытия иконок в трее для WinXP
  TraySysPager:Cardinal; //SysPager - Иконки прог в трее
  TrayTB32:Cardinal; //ToolbarWindow32 - Область уведомлений в трее
  Tray_pId:Cardinal; //Идентификатор процесса-владельца трея

implementation

{$R *.dfm}

uses CommCtrl;

function InTray():boolean;
//Инициализация переменных для доступа к трею
var s:string;
begin
 Result:=false;
 s:='';
 TrayWnd:=findwindow('Shell_TrayWnd', nil);
 if TrayWnd<>0 then
  begin
   TrayNW:=findwindowex(TrayWnd,0,'TrayNotifyWnd', nil);
   if TrayNW<>0 then
    begin
     TrayButton:=findwindowex(TrayNW,0,'Button',nil);
     TraySysPager:=findwindowex(TrayNW,0,'SysPager', nil);
     if TraySysPager<>0 then
      begin
       TrayTB32:=findwindowex(TraySysPager,0,'ToolbarWindow32', nil);
       if TrayTB32<>0 then
        begin
         Tray_pID:=0;
         GetWindowThreadProcessId(TrayWnd,@Tray_pID);
         if Tray_pID<>0 then Result:=true else
          s:='Не могу определить идентификатор'+#13+#10+'процесса - владельца трея!';
        end else s:='Область уведомлений в трее - не найдено!'
      end else s:='SysPager в трее - не найден!';
    end else s:='Трей - не найден!';
  end else s:='Панель задач - не найденна!';
 if Result=false then ShowMessage(s);
end;

procedure TForm1.Button1Click(Sender: TObject);
var i:TTBBUTTONINFO; 
    opTBW32:Cardinal;
    s,j,t:DWord;
    rMem:Pointer;
begin
 InTray;
 opTBW32:=OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE,false,Tray_pId);
 if opTBW32<>0 then
  begin
   s:=SizeOf(i);
   rMem:=VirtualAllocEx(opTBW32,nil,s,MEM_RESERVE or MEM_COMMIT,PAGE_READWRITE);
   if rMem<>nil then
    begin
     i.cbSize:=SizeOf(i);
     i.dwMask:=TBIF_SIZE;
     j:=SendMessage(TrayTB32,TB_BUTTONCOUNT,0,0);
     while (j>0) do
      begin
       dec(j);
       i.cx:=30; //Нужная нам ширина для j-кнопки
       WriteProcessMemory(opTBW32,rMem,@i,s,t);
       SendMessage(TrayTB32,TB_SETBUTTONINFO,j,integer(rMem)); //j - номер кнопки
      end;
     VirtualFreeEx(opTBW32,rMem,0,MEM_RELEASE);
    end;
   CloseHandle(opTBW32);
  end;
end;
...

PS: Картинку, с текстом... сам замениш... smile

Автор: Poseidon 6.4.2005, 17:20
Цитата(_hunter @ 6.4.2005, 14:14)
Poseidon, перед тем, как что-то советуеш, нужно это самому попробовать сделать...
Что-то я не понял! Это о чем? Об этом:
Цитата(Poseidon @ 6.4.2005, 12:15)
PS. Нужно иногда в FAQ заглядывать!
или об этом:
Цитата(Poseidon @ 6.4.2005, 12:15)
Вот эта статья:
Если о первом, то не понятно, в чем я не прав. Я всегда смотрю FAQ перед тем как задать вопрос! А вот если о втором, то я ничего и не советовал. Я просто указал гда можно найти статью, о каторой говорил Snowy. Вот и все! Не понимаю, в чем я не прав?

Автор: _hunter 6.4.2005, 17:43
о статье. она делает немного не то, что просили. и смысла в том, чтобы ее давать я не вижу ( даже если ее кто-то упомянул )

Girder, прикольный код. только непонятно каким макаром rMem попадает туда, куда нужно

Автор: Poseidon 6.4.2005, 18:46
Цитата(_hunter @ 6.4.2005, 17:43)
о статье. она делает немного не то, что просили. и смысла в том, чтобы ее давать я не вижу ( даже если ее кто-то упомянул )

Просили:
Цитата(PavelPro @ 5.4.2005, 17:26)
Как сделать чтобы вместо иконки в трее показывалася строка?
Статья называется:
Цитата
Отображаем текст в System Tray.

Если там не то, то в этом не моя вина!

Автор: _hunter 6.4.2005, 18:52
вот потому и нужно проверять smile
потому как за предоставляемую информацию отвечает предоставляющий smile

Автор: Poseidon 7.4.2005, 02:18
Цитата(_hunter @ 6.4.2005, 18:52)
потому как за предоставляемую информацию отвечает предоставляющий
Спасибо. Учту на будущее.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)