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

Вниз

32 бита и TImageList   Найти похожие ветки 

 
sj   (2003-01-18 09:50) [0]

Здравствуй уважаемый All;

Имеем Windows 9x/NT/XP при различных цветовых палитрах (256 и более) и Delphi5 UP1.
Цель забрать у богатого Билли иконки и отдать бедным в виде PopupMenu.
Пытаемся реализовать, используя ImageList.


hLib := LoadLibrary(PChar(SystemDirectory + "\shell32.dll"));
hIc := LoadIcon(hLib, MAKEINTRESOURCE(Index);
// возвращает указатель на красивую иконку в зависимости от текущей цветовой палитры

Picture := TPicture.Create;
Picture.Icon.Handle := hIc;
ImageList1.AddIcon(Picture.Icon);
// При 8 и 16 битах всё замечательно, а вот при 32 – имеем потери.


Насколько могу понимать TBitmap не приспособлен для работы с 32 битными картинками.
Сейчас пришлось создать TPicture, перехватить DrawItem и рисовать самому, но очень мне это не нравиться. Если возможно, предложите другие варианты.


 
Ricks   (2003-01-19 21:08) [1]

Bitmap как раз предназначен для работы с 32-х битным изображением. Но рисовать его можно только в XP. Делаем так:

uses
..., CommCtrl;

...
ImageList_Create(...);
Imagelist_AddIcon() // по-моему, так называется :-)
ImageList_Draw(...);
Imagelist_Destroy(...);


но при этом в прогамме обязательно должен быть manifest!
Удачи.


 
sj   (2003-01-20 08:41) [2]

Спасибо, был не прав, TBitmap не в чём не виноват :)

himl := ImageList_Create(32, 32, ILC_MASK or ILC_COLOR32, 0, 4);
Imagelist_AddIcon(himl, hicon);
типа такого …

глюки при 32 битах в ХP возникают при использовании маски (ILC_MASK);


 
sj   (2003-01-20 18:51) [3]

Уважаемые Мастера, если Вас не затрудит, посмотрите на этот кусочек текста и объясните, пожалуйста, в чём я не прав.
(XP, Цветовая палитра: 32 бита)

uses
..., CommCtrl;
...
var
hIc, hLib: THandle;
SystemDirectory: PChar;
hIml: THandle;
begin
GetMem(SystemDirectory, MAX_PATH);
GetSystemDirectory(SystemDirectory, MAX_PATH);
hLib := LoadLibrary(PChar(SystemDirectory + "\shell32.dll"));
hIml := ImageList_Create(32, 32, ILC_COLORDDB or ILC_MASK, 0, 4);
Hic := LoadIcon(hLib, MAKEINTRESOURCE(20));
Imagelist_AddIcon(hIml, hIc);
ImageList_Draw(hIml, 0, Self.Canvas.Handle, 0, 0, ILD_NORMAL);
end;


 
Evgeny   (2003-01-21 11:20) [4]

Ну что память освободить забыл, наверное уже и сам заметил. Но зачем усложнять. Можно и так:
SystemDirectory: array[Byte] of Char;


 
sj   (2003-01-21 12:38) [5]

да бог с ней с памятью, и с SystemDirectory,
почему не прорисовывается 32 бита



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

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

Наверх





Память: 0.46 MB
Время: 0.008 c
1-67388
a$modeu$
2003-04-10 14:10
2003.04.21
Пожалуйста разесните мне


9-67080
Farcaller
2002-11-01 11:30
2003.04.21
OpenGL


1-67224
Neox
2003-04-10 21:51
2003.04.21
выделение в ListView


1-67226
Стражник
2003-04-10 17:35
2003.04.21
Access Violation...........


14-67460
Макс Р.
2003-04-05 14:02
2003.04.21
Уменьшение размера экзешника





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский