Головна сторінка
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;

Починати

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]);
Кінець;



ВСІМ! ЗАРАНЕЕ величезне спасибі!

З мене пиво, якщо Ви з Барнаула або будете проїздом! Серйозно!
Приїжджайте до нас! У нас скоро День Міста і 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 AS



МитяЙ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;
було
FileInfo: TSHFileInfo;
LIcon: TIcon;
LPath: string;
починати
LPath: = Path;
LIcon: = TIcon.Create;
result: = - 1;
намагатися
SHGetFileInfo (PChar (LPath), 0, FileInfo, SizeOf (FileInfo), SHGFI_ICON or SHGFI_SMALLICON);
LIcon.Handle: = FileInfo.hIcon;
result: = ilSystem.AddIcon (LIcon);
в кінці кінців
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.029 c
1-74806
Даніл
2002-12-11 13:44
2002.12.23
Вибачте звичайно, але я не можу lib підключити ...


1-74675
Nazira
2002-12-13 11:08
2002.12.23
Як почати програмувати на Delphi


7-75016
angelcom
2002-10-20 08:03
2002.12.23
питання про принтерах


14-74941
MBo
2002-11-29 10:14
2002.12.23
Чергова завдання для розминки мізків;)


8-74850
Вован2
2002-09-08 19:25
2002.12.23
поворот зображення





африкаанс албанський арабська вірменин азербайджанець баскський білоруський болгарська каталонський Китайська (спрощене письмо) Китайський традиційний) хорватський чеська данську мову нідерландський Ukranian естонець Філіппінська фінську мову французький
галісійська грузинський німецький грецький гаїтянський креольський давньоєврейську хінді угорський ісландський індонезієць ірландський італійський японський корейський латиська литовець македонець малайський мальтійський норвежець
перс полірування португальська румунський російська сербський словацький словенський іспанська суахілі шведську мову тайський турецька український урду в'єтнамський валлійський ідиш бенгальський боснійський
кебуано есперанто гуджараті хауса хмонг ігбо яванський каннада кхмерская Лао латинь маорі маратхі монгольський непальська панджабі сомалійський тамільська телугу йоруба
зулуський
Англійська Французький Німецький Італійський Португальська Русский Іспанська