Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Динамическое изменение TIcon


Автор: Рубик 2.8.2011, 11:58
Здравствуйте. Нужно рисовать индикатор на TIcon динамически и присваивать его значение TrayIcon.Icon.

Проблема в том, что у TIcon отсутствует Canvas, и рисовать на нем нельзя. Фон для TIcon хранится в TImageList.
Я делаю так: получаю ImageList.GetBitmap, затем на этом TBitmap рисую что нужно, делаю ImageList.Insert и затем ImageList.GetIcon, где и получаю иконку. Но при этом почему-то теряется прозрачность (иконка изначально 32-битная).
У ImageList стоит ColorDepth = cd32Bit.

Вопрос в том, как корректно нарисовать на 32-битной иконке (TIcon), получаемой из ImageList что-нибудь, например, прямоугольник.

Delphi 2010, Win 7

Автор: CodeMonkey 2.8.2011, 15:39
На иконке рисовать нельзя. Рисовать надо на Bitmap. Прозрачность задаётся двумя способами - по маске, либо по контрольному цвету.

Автор: Рубик 2.8.2011, 16:24
Цитата(CodeMonkey @ 2.8.2011,  15:39)
На иконке рисовать нельзя. Рисовать надо на Bitmap. Прозрачность задаётся двумя способами - по маске, либо по контрольному цвету.

Для 32-битных иконок прозрачность задается иначе (4-ым байтом), насколько я понимаю.

Автор: ZBugz 10.8.2011, 07:36
А если заменить Ticon на Timage ?

Добавлено через 59 секунд
И еще попробывать поставить TrayIcon.Icon.Transparent:=True;

Автор: Чучмек 12.8.2011, 21:59
Код

var
bmMask,bmColor:tbitmap;
ico:ticon;
icoinfo:ticoninfo;
NID:TNotifyIconData;

begin
bmMask:=tbitmap.Create;
bmColor:=tbitmap.Create;
ico:=ticon.Create;

bmMask.Height:=32;
bmMask.Width:=32;
bmMask.Monochrome:=true;
 bmMask.Canvas.LineTo(32,32);

bmColor.Height:=32;
bmColor.Width:=32;
 bmColor.Canvas.Pen.Color := clRed;
 bmColor.Canvas.LineTo(32,32);

icoinfo.fIcon:=true;
icoinfo.xHotspot:=0;
icoinfo.yHotspot:=0;
icoinfo.hbmMask:=bmMask.Handle;
icoinfo.hbmColor:=bmColor.Handle;

ico.Handle:=CreateIconIndirect(icoinfo);

NID.cbSize:=sizeof(NID);
NID.Wnd:=form1.Handle;
NID.uFlags:=NIF_ICON;
NID.hIcon:=ico.Handle;
Shell_NotifyIcon( NIM_ADD,@NID);

Дальше сам разберешься

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