Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Иконка в SysTray

Автор: f_serg
Дата сообщения: 14.12.2002 08:11
pbromiks

Цитата:
Только вот мерцание во время смены иконки.

Что значит мерцание?
Автор: pbromiks
Дата сообщения: 16.12.2002 19:35
Когда происходит смена иконки, она сначала исчезает (старая), а потом появляется новая и получается эффект мерцания.
Да я не объяснил: у меня она типа анимированной. Т.е. одна заменяется другой много раз в цикле, пока не будет определенных действий от пользователя. Вот.
А может есть возможность использовать в качестве картинки GIF ?
Автор: Pinocchio
Дата сообщения: 17.12.2002 11:27

Цитата:
А может есть возможность использовать в качестве картинки GIF ?

Действительно, а что если lpData.hIcon = hGif ??? [:*]|[
Вот Бил Гейтс с гифами пролетел

А вопрос можно? Зачем менять хандле иконки, если её нужно только перерисовать. У меня пример показывает в SysTray, сколько занятой/свободной памяти кружочком с секторами.
И НИЧЕГО НЕ МОРГАЕТ.
К сожалению он на Delphi и Вам не подойдёт.
Автор: pbromiks
Дата сообщения: 17.12.2002 18:55
Pinocchio
!!!!!! Так мне на Дельфах и надо!!!
ПЛИЗЗЗЗЗЗЗЗЗЗЗЗЗЗЗЗЗЗЗЗЗЗЗЗ....
Автор: raven
Дата сообщения: 17.12.2002 22:35
Pinocchio
Если написано на WinApi то практически то же самое, если же через rx, то Сишники отдыхают.
Автор: pbromiks
Дата сообщения: 22.01.2003 06:49
raven
А подробнее можно?
Автор: FuzzyLogic
Дата сообщения: 22.01.2003 07:26

Цитата:
raven
А подробнее можно?

http://sourceforge.net/projects/rxlib/
качаешь RxLib, ставишь, появляется компонента которая делает тебе SysTray иконку, кидаешь на форму и voila.

Добавлено

Цитата:
Вот Бил Гейтс с гифами пролетел

А с гифами похоже не один Гейтс пролетел, судя по новым правилам лицензирования.
Автор: YakutAlex
Дата сообщения: 22.01.2003 15:14
FuzzyLogic
Я прошу прощения за свою безграмотность. Но как поставить эту компоненту?
Без компоненты у меня не получилось по примеру Daemon.
А ссылка от Wowik не пашет. А ведь так хотелось разобраться.
Знаю, что надо почитать WinAPI. Новичок я на этом поприще!!!
Автор: Felix
Дата сообщения: 22.01.2003 16:21
YakutAlex когда установишь RXLib прочитай инструкцию по инсталляции на русском (она должна быть там же, где и установленный пакет с компонентами). Для начала достань RX
Автор: FuzzyLogic
Дата сообщения: 22.01.2003 19:09
www.rxlib.ru

Там есть новый дистрибутив в котором имеется help и инструкции по установке.
Автор: YakutAlex
Дата сообщения: 23.01.2003 09:31
Всем спасибо за помощь. Если еще вопросы будут, то вернусь.
Автор: Serjik
Дата сообщения: 25.06.2003 07:33
можно ли как-нибудь отобразить в трейе более 16 цветов? или даже 4-х цветов?!
Автор: FromRedmond
Дата сообщения: 29.07.2003 04:40
We do not allow to list SysTray icons. So you cannot list them such way: Prev <--> Next

All you can do is access Systray from your application.
Or use some Active Accesability APIs to access them. But it is another story.
Автор: Serjik
Дата сообщения: 29.07.2003 04:58
FromRedmond
I'm using Shell_NotifyIcon(...) API-function to add/change/remove icon in SysTray.
I desired my trouble. To correct display icon in SysTray, it must by 16-colors, original size icon in Tray is 16x16 pixels, but if you apply this icon on NOTIFYICONDATA structure, icon may be change colors of some pixels. To fix this problem, you have to resize you 16x16 icon up to 32x32, and after that apply on NOTIFYICONDATA structure.
Автор: Mamay
Дата сообщения: 29.07.2003 17:31
cooltray.zip [http://downloads.delphi32.com/2726/5086/cooltray.zip]
классный компонент для помещения приложения в трей
Автор: Serjik
Дата сообщения: 30.07.2003 00:00
Mamay
компонент это хорошо, только я на VC сижу
Автор: a4n
Дата сообщения: 04.10.2005 11:27
Помогите пожалуйста! Нужно в трей поместить текст ( иконку динамически создавать из текста ). Пишу на VC++ MFC. Знаю что нужно вначале нарисовать текст, потом сделать из него картинку с помощью побитового копирования, потом сконвертировать в иконку и передать хендл. Но как это всё сделать не знаю =( Помогите.

Добавлено:
ну помогите =)
Автор: EAS
Дата сообщения: 04.10.2005 21:45

Цитата:
ну помогите =)

С какой из частей помочь то?
Автор: ShIvADeSt
Дата сообщения: 05.10.2005 00:54
a4n
в свое время делал.

Цитата:

procedure TForm1.Button1Click(Sender: TObject);
var
IconSizeX : integer;
IconSizeY : integer;
AndMask : TBitmap;
XOrMask : TBitmap;
IconInfo : TIconInfo;
Icon : TIcon;
OldBkMode : integer;
OverRect : TBitmap;
begin
{Get the icon size}
IconSizeX := GetSystemMetrics(SM_CXICON);
IconSizeY := GetSystemMetrics(SM_CYICON);

{Create the "And" mask}
AndMask := TBitmap.Create;
AndMask.Monochrome := true;
AndMask.Width := IconSizeX;
AndMask.Height := IconSizeY;

{Draw on the "And" mask}

AndMask.Canvas.Brush.Color:=clBlack;
AndMask.Canvas.FillRect(Rect(0, 0, IconSizeX, IconSizeY));
{ OverRect.Canvas.Brush.Color:=clBlack;
OverRect.Canvas.FillRect(Rect(0, 0, IconSizeX, IconSizeY));
OverRect.Canvas.Brush.Color :=clBlack;
OverRect.Canvas.FillRect(Rect(3, 3, 3+((IconSizeX-6)*Percent div 100), IconSizeY-4));

// AndMask.Canvas.Brush.Color := clBlack;
AndMask.Canvas.Font.Size:=13;
AndMask.Canvas.Font.Style:=[fsBold];
AndMask.Canvas.Font.Color:=clWhite;
OldBkMode := SetBkMode(AndMask.Canvas.Handle,TRANSPARENT);
AndMask.Canvas.TextOut(3, 8, Format('%3d',[Percent]));
SetBkMode(AndMask.Canvas.Handle, OldBkMode);
AndMask.Canvas.CopyMode:=cmSrcInvert;
AndMask.Canvas.Draw(0,0,OverRect);}
{Draw as a test}
Form1.Canvas.Draw(IconSizeX * 2, IconSizeY, AndMask);
// Form1.Canvas.Draw(IconSizeX * 2, IconSizeY, OverRect);
{Create the "XOr" mask}
OverRect:=TBitmap.Create;
XOrMask := TBitmap.Create;
XOrMask.Width := IconSizeX;
XOrMask.Height := IconSizeY;
OverRect.Monochrome :=False;
OverRect.Width := IconSizeX;
OverRect.Height := IconSizeY;


{Draw on the "XOr" mask}
XorMask.Canvas.Brush.Color := clBlack;
XorMask.Canvas.FillRect(Rect(0, 0, IconSizeX, IconSizeY));
OverRect.Canvas.Brush.Color:=clWhite;
OverRect.Canvas.FillRect(Rect(2, 2, IconSizeX, IconSizeY));
OverRect.Canvas.Brush.Color :=clNavy;
OverRect.Canvas.FillRect(Rect(2, 2, 2+((IconSizeX)*Percent div 100), IconSizeY));
XorMask.Canvas.Font.Size:=20;
XorMask.Canvas.Font.Style:=XorMask.Canvas.Font.Style+[fsBold,fsItalic];
OldBkMode := SetBkMode(XorMask.Canvas.Handle,TRANSPARENT);
XorMask.Canvas.Font.Color:=clNavy xor clWhite;
XOrMask.Canvas.TextRect(Rect(0, 0, IconSizeX, IconSizeY),1,0, Format('%2d',[Percent]));
SetBkMode(XorMask.Canvas.Handle, OldBkMode);
XorMask.Canvas.CopyMode:=cmSrcInvert;
XorMask.Canvas.Draw(0,0,OverRect);
XorMask.Canvas.MoveTo(0,IconSizeY);
XorMask.Canvas.Pen.Color:= clBlack;
XorMask.Canvas.Pen.Width:=4;
XorMask.Canvas.LineTo(0,0);
XorMask.Canvas.LineTo(IconSizeX,0);

OverRect.Free;

{Draw as a test}
Form1.Canvas.Draw(IconSizeX * 4, IconSizeY, XOrMask);

{Create a icon}
Icon := TIcon.Create;
IconInfo.fIcon := true;
IconInfo.xHotspot := 0;
IconInfo.yHotspot := 0;
IconInfo.hbmMask := AndMask.Handle;
IconInfo.hbmColor := XOrMask.Handle;
Icon.Handle := CreateIconIndirect(IconInfo);

{Destroy the temporary bitmaps}
AndMask.Free;
XOrMask.Free;

{Draw as a test}
DrawIcon(Form1.Canvas.Handle,300,300,Icon.Handle);

{Assign the application icon}
Tray.Icon := Icon;
// Tray.Enabled:=True;

{Force a repaint}
InvalidateRect(Application.Handle, nil, true);
if Percent=100 then Timer1.Enabled:=False;
{Free the icon}
Icon.Free;
Inc(Percent);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Percent:=1;
end;


Автор: EAS
Дата сообщения: 05.10.2005 21:01
ShIvADeSt

Цитата:
Нужно в трей поместить текст ( иконку динамически создавать из текста ). Пишу на VC++ MFC

Если не принимать во внимание, что в MFC нет таких маленьких радостей как TIcon и компонентов для создания tray icon , то cool

a4n
Если хочешь все самостоятельно накодить, то спрашивай, что конкретно не ясно/понятно. Если хочется примеры кода/исходники и т.п. (+с английским не враждуешь), то советую поискать на codeproject.com. Там этого гуталина...
Автор: ShIvADeSt
Дата сообщения: 06.10.2005 03:14
EAS

Цитата:
Если не принимать во внимание, что в MFC нет таких маленьких радостей как TIcon и компонентов для создания tray icon , то cool

Я не думаю, что трудно будет перейти от ВЦЛ к АПИ. Просто мне это не надо, я привел рабочий пример, а перевести на нужный язык я думаю труда не составит.
Автор: a4n
Дата сообщения: 09.10.2005 16:22
Ребят, спасибо за то, что пытаетесь мне помоч. Сейчас я постараюсь уточнить чтои именно мне не понятно Значит я создаю битмап ( картинку с текстом ):
CClientDC dc(this); // ------- слздаём bitmap и рисуем картинку -----------
CRect rect;
CDC dcMem;
CBitmap bitmap, *pBitmap;
HFONT font;
font = CreateFont(17/*ширина*/ , 6 /*высота*/,0,0,400,false,
true,false,DEFAULT_CHARSET, OUT_CHARACTER_PRECIS ,
CLIP_CHARACTER_PRECIS,PROOF_QUALITY, VARIABLE_PITCH,
CString("Courier New"));
dcMem.CreateCompatibleDC(&dc);
SelectObject(dcMem,font);
rect.left=0;
rect.top=0;
rect.right=16;
rect.bottom=16;
bitmap.CreateCompatibleBitmap(&dc,rect.right,rect.bottom);
pBitmap=dcMem.SelectObject(&bitmap);
dcMem.DrawText(CString(infa),rect,DT_CENTER|DT_VCENTER);
dc.BitBlt(0,0,rect.right,rect.bottom,&dcMem,0,0,SRCCOPY);

Теперь у меня на форме рисуеться рисунок 16х16, с текстом из переменной infa ( ну там число простое к примеру 150 ). Далее как я понял надо создать AND и XOR маску, потом описать структуру HICON и с помощью функции Createiconinderect создать иконку Но я не понял как сделать маски эти =( Если есть исходники буду рад, но лучше конешно обьяснить что да как Заранее спасибо Вам!

p.s код на дельфи я смотрел, но перевести его на mfc не смог =(
Автор: ShIvADeSt
Дата сообщения: 10.10.2005 01:13
a4n
Вверху рабочий пример программы, чем тебе не исходники? Или нужно еще перевести на АПИ? Если второе, то сам сделай, там ничего трудного нет, все операции аналогичные, просто возьми их аналоги из АПИ.
Автор: a4n
Дата сообщения: 10.10.2005 13:54
ShIvADeSt
Мне про маски непонятно как их сделать =\ для чего они.
Автор: ShIvADeSt
Дата сообщения: 11.10.2005 00:58
a4n
Маски нужны, чтобы сделать из 2 битмапов иконку. Так как если посмотришь на TIconInfo то для создания иконки нужны 2 маски. Как создать. блин да посмотри ты на пример. Только вместо Tbitmap манипулируй с СBitmap или что там у вас в MFC, я подобное делал на АПИ, правда не иконку, но работа с битмапами.
Автор: a4n
Дата сообщения: 11.10.2005 09:23
ShIvADeSt
а почему из 2-х ? чем отличаютсья XOR от AND ? или они абсолютно одинаковые ?
Автор: devchaos
Дата сообщения: 11.10.2005 10:12
NOTIFYICONDATA pnid;

pnid.cbSize=sizeof(NOTIFYICONDATA);
pnid.hWnd=hwnd;
pnid.uID=101;
pnid.uFlags=NIF_ICON | NIF_MESSAGE | NIF_TIP;
pnid.uCallbackMessage=1001;
pnid.hIcon=LoadIcon(NULL, IDI_APPLICATION);
strcpy(pnid.szTip,_T("Тест"));
Shell_NotifyIcon(NIM_ADD,&pnid);
Автор: a4n
Дата сообщения: 11.10.2005 13:28
уже почти получилось, потом код покажу =)
Автор: ShIvADeSt
Дата сообщения: 12.10.2005 00:53
a4n

Цитата:
а почему из 2-х ? чем отличаютсья XOR от AND ? или они абсолютно одинаковые ?

А хелп читать по структуре ICONINFO для CreateIconIndirect Не пробовал? Вот кусок оттуда

Цитата:

hbmMask

Specifies the icon bitmask bitmap. If this structure defines a black and white icon, this bitmask is formatted so that the upper half is the icon AND bitmask and the lower half is the icon XOR bitmask. Under this condition, the height should be an even multiple of two. If this structure defines a color icon, this mask only defines the AND bitmask of the icon.

hbmColor

Identifies the icon color bitmap. This member can be optional if this structure defines a black and white icon. The AND bitmask of hbmMask is applied with the SRCAND flag to the destination; subsequently, the color bitmap is applied (using XOR) to the destination by using the SRCINVERT flag.

как не трудно заметить нужно ДВЕ битмапы, в тонкостях не разбирался, но то что сделал - рабочий код. Для того, чтобы определить, одинаковы ли они, посмотри метод их создания, вроде бы нет.
Автор: a4n
Дата сообщения: 12.10.2005 08:08
ShIvADeSt
=)) дак ты сам вначале разверись, потом посылай читать! Не знаю рабочий ли у тебя код, но коментариев излишне

Иконку я сделал, сейчас приведу в порядок код и выкину. Для CreateIconIndirect надо маску и собсно битовый массив, маска должна быть квадрат просто монохромный, а я её вообще не делал, указал битмапа два одинаковых с моим рисунком.

p.s код на mfc и на vcl сильно отличаються.

Добавлено:
CClientDC dc(this);
CRect rect;
CDC dcMem;
CBitmap bitmap, *pBitmap;
HFONT font;
font = CreateFont(0 , 6,1,2,400,false,
true,false,DEFAULT_CHARSET, OUT_CHARACTER_PRECIS ,
CLIP_CHARACTER_PRECIS,PROOF_QUALITY, VARIABLE_PITCH,
CString("Courier New"));
dcMem.CreateCompatibleDC(&dc);
SelectObject(dcMem,font);
rect.left=0;
rect.top=0;
rect.right=16;
rect.bottom=16;

dc.BitBlt(0,0,rect.right,rect.bottom,&dcMem,0,0,SRCCOPY);
bitmap.CreateCompatibleBitmap(&dc,rect.right,rect.bottom);
pBitmap=dcMem.SelectObject(&bitmap);
dcMem.DrawText("a4n",rect,DT_CENTER|DT_VCENTER);

//Create a icon
ICONINFO iinfo={true, 0,0, bitmap, bitmap};
HICON hicon = CreateIconIndirect(&iinfo);

NOTIFYICONDATA ndata;
ndata.cbSize=sizeof(NOTIFYICONDATA);
ndata.uID=2000;
ndata.hWnd=m_hWnd;
ndata.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP;
ndata.uCallbackMessage=MYWM_NOTIFYICON;
ndata.hIcon= hicon;
strcpy(ndata.szTip,"подсказка");
Shell_NotifyIcon(NIM_ADD,&ndata);

Страницы: 123

Предыдущая тема: нуна помощь по Си:)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.