Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2002.12.23;
Скачать: [xml.tar.bz2];

Вниз

Как узнать какой цвет прозрачный у объекта TIcon?   Найти похожие ветки 

 
МитяЙ2   (2002-09-01 07:48) [0]

Как узнать какой цвет прозрачный у объекта TIcon?
(про пиксел в нижнем левом углу я уже слышал - это не то!)



1. Я извлекаю маленькую первую иконку из exe-шника:
(все отлично работает)

var Icon:TIcon;
IconLarge,IconSmall:HIcon;

ExtractIconEx("c:\winnt\explorer.exe", 0,IconLarge,IconSmall,1);
Icon.Handle:=IconSmall;

2. Добавляю объект в ListBox:


if Icon.Handle<>0 then // Если иконка извлечена из exe-шника...
begin
Bitmap:=TBitmap.Create;
Bitmap.Width:=16;
Bitmap.Height:=16;

Bitmap.TransparentColor:=clNone; // НЕ ЗНАЮ КАКОЙ ЦВЕТ!!!
// Если ставишь clWhite
// страшно смотреть, т.к.
// белый цвет становится прозрачным.
Bitmap.Transparent:=true;
Bitmap.TransparentMode:=tmFixed; // tmFixed означает, что
// TransparentColor мы сами
// назначаем.

// Теперь иконку прорисовываем на канве Bitmap"а...
DrawIconEx(Bitmap.Canvas.Handle,0,0,Icon.Handle,16,16,0,0,DI_NORMAL);

// И добавляем объект в список
Form.ListBox1.Items.AddObject(<текст>, TBitmap(Bitmap));

end;

3. В методе ListBox1DrawItem, который вызывается при прорисовке содержимого
ListBox1 выполняю следующее:

procedure TForm.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var Bitmap:TBitmap;
Offset:integer;

Begin

with Control as TListBox, Canvas do
Begin

Bitmap:=TBitmap(Items.Objects[index]); // index - номер прорисовываемого объекта...

if Bitmap<>nil then // Если была ранее загружена иконка...
Begin
// Выводим на канву картинку...
BrushCopy(Bounds(Rect.Left+4,Rect.Top,Bitmap.Width,Bitmap.Height),
Bitmap,
Bounds(0,0,Bitmap.Width,Bitmap.Height),
Bitmap.TransparentColor); // Последний параметр - цвет, который заменяется
// на цвет канвы (т.е. "прозрачный" цвет),
// который в пункту 2. я НЕ ЗНАЮ КАК ОПРЕДЕЛИТЬ!
Offset:=Bitmap.Width+7;
End else Offset:=23;

// Выводим на канву текст...
TextOut(Rect.Left+Offset,Rect.Top,Items[index]);
End;



ВСЕМ! ЗАРАНЕЕ ОГРОМНОЕ СПАСИБО!

С меня пиво, если Вы из Барнаула или будете проездом! Серьезно!
Приезжайте к нам! У нас скоро День Города и 65-ти летие Алт. края!



Меньше Вам багов коллеги! МитяЙ.


 
Poirot   (2002-09-01 10:20) [1]

Я торможу, но зачем после чтения иконки надо рисовать битмап... а?
Помоему иконка нарисуется великолепно?
I am wrong?


 
МитяЙ2   (2002-09-01 10:45) [2]

Дело в том, что в ListBox1 можно поместить TBitmap, а объект TIcon
нет.


 
Ketmar   (2002-09-01 12:08) [3]

а у иконки нет "прозрачных" цветов. там используется маска. так что вариант - залить битмап цветом, которого точно в иконке нету, а потом использовать его как прозрачный. только не надо спрашивать, как оперделить, какой цвет в иконке не используется :-))

Satanas Nobiscum! 01-Sep-XXXVII A.S.


 
МитяЙ2   (2002-09-01 12:54) [4]

А в мыслях сразу возник такой вопрос!

Но это сделать не сложно. Спасибо!
Будем пробовать.

Пишите, если ещё кто-нибудь с этим сталкивался!


 
МитяЙ2   (2002-09-01 17:51) [5]

Так пиво никому не досталось (кроме меня)!

Все разобрался:


Bitmap:=TBitmap.Create;
Brush:=TBrush.Create;
Brush.Color:=ListColor; // ListColor - цвет фона в ListBox"e

Bitmap.Width:=16;
Bitmap.Height:=16;

Bitmap.TransparentColor:=ListColor;
Bitmap.Transparent:=true;

DrawIconEx(Bitmap.Canvas.Handle,0,0,Icon.Handle,16,16,0, Brush.Handle,DI_NORMAL);
Bitmap.TransparentMode:=tmFixed;


Пошел обмывать............................


 
msts   (2002-09-02 10:01) [6]

не знаю для чего конкретно используешь свой код
но например можно сделать так:

function ????.LoadIconByPath(Path: string): integer;
var
FileInfo: TSHFileInfo;
LIcon : TIcon;
LPath : string;
begin
LPath := Path;
LIcon := TIcon.Create;
result:=-1;
try
SHGetFileInfo(PChar(LPath), 0, FileInfo, SizeOf(FileInfo), SHGFI_ICON or SHGFI_SMALLICON);
LIcon.Handle := FileInfo.hIcon;
result:=ilSystem.AddIcon(LIcon);
finally
LIcon.Free;
end;
end;

возвращает номер картинки в списке (ilSystem - TImageList)
далее сохраняешь номер и по нему рисуешь, я так делал когда
в списке картинок помимо загружаемых есть другие (в дизайнтайме указанные)

можно по другому - получить хендел системного imagelist
и переопределить его у уже созданного (как в LIcon.Handle := FileInfo.hIcon; только для TImageList) -

FSmallImages := SHGetFileInfo("C:\", { Do not localize }
0, FileInfo, SizeOf(FileInfo), SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
FLargeImages := SHGetFileInfo("C:\", { Do not localize }
0, FileInfo, SizeOf(FileInfo), SHGFI_SYSICONINDEX or SHGFI_LARGEICON);
FRoot := SRFDesktop;

кусок из \Borland\Delphi6\Demos\ShellControls\ShellCtrls.pas


 
Митяй2   (2002-09-08 14:41) [7]

Да, попробовал!

Спасибо, msts

Все работает и программный код стал меньше и иконки
корректно отображаются!


Вот, только, можно перед добавлением в ImageList
как-нибудь проверить наличие добавляемой иконки,
может она уже есть и нужно возвратить только
индекс? Так, например, если есть сотня другая
одинаковых иконок, то логичнее было бы не добавлять
новую иконку в ImageList, а найдя её возвратить пор. номер
и присвоить объекту, находящемуся в ImageList.
Т.е. у меня каждому эл-ту ListBox сопоставляется индекс
иконки. А раньше я вместо индекса "загонял" сам объект
в список.
Пробовал сделать через TStringList (как дополнительный
объект хранящий пути к иконкам) - работает. Но это
не есть хороший способ программирования.



Страницы: 1 вся ветка

Форум: "Media";
Текущий архив: 2002.12.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.59 MB
Время: 0.038 c
1-74629
vilfred
2002-12-10 14:42
2002.12.23
глюки в объявлении переменных


1-74844
Vit@ly
2002-12-08 17:14
2002.12.23
Проблема с Memo в XP и Win2000


1-74746
ctapik-net
2002-12-14 17:41
2002.12.23
Как получить интерфейс IShellFolder указывающий на Entire Network


1-74766
JC
2002-12-06 12:42
2002.12.23
Как приостановить выполнение процедуры, чтоб все остальные


1-74670
Tundra
2002-12-12 13:02
2002.12.23
Как сделать прозрачный прямоугольник?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский