Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.02.2007, 00:56   #1
And1
Пользователь
 
Регистрация: 18.02.2007
Сообщений: 10
Злость Иконки в TImageList с цветовыми переходами

У меня есть картинки, которые мне нужно поместить в качестве иконок в TImageList. ПРоблема в том, что эти картинки подогнаны под один конкретный цвет фона, и при изменении фона на другой они становятся до бессмысленности некрасивыми. Таким образом, если у юзера цвета Windows отличаются от моих, такие иконки у него будут выглядеть фигово. Насколько я понял, иконки можно делать, чтобы они самостоятельно автоматически адаптировались к текущему цвету фона, т.е. чтобы у них области, сглаживающие переход от границ основного содержимого каринки к её фону (т.е. к областям с прозрачным цветом), автоматически изменялись в цвете в зависимости от текущего цвета фона (например, так сделаны системные иконки, которые видны в проводнике). Кто мне скажет, как и чем это делается - у ImageEditor Delphi7 я таких возможностей обнаружить не смог.

Попутный вопрос - я выдираю иконку из системного ImageList, загоняю её в TImage (методом TImageList.GetIcon), и она чудесным образом отображается с сохранением этой самой автоматической адаптации к цвету фона. НО при попытке сохранения иконки в файл (методом TImage.Picture.Icon.SaveToFile) она сохраняется в 16-ти цветовой палитре, хотя на экране отображается как минимум в 256-цветной палитре. Как сохранить чёртову иконку в файл, чтобы она сохранилась в оригинальном виде?

Большая просьба, если вдруг вам есть что ответить на эти вопросы - не используйте программёрский слэнг - я не профессиональный программист, вряд ли вас пойму. Попроще, поподобней, пожалуйста.
And1 вне форума Ответить с цитированием
Старый 19.02.2007, 10:55   #2
А. Долматов
Форумчанин
 
Аватар для А. Долматов
 
Регистрация: 15.02.2007
Сообщений: 183
Сообщение

Слушай у иконки нет свойства прозрачночти фона? Просто необходимо по сути сделать так, чтобы фон иконки не использовался вообще, т.е. прозрачность установить полную и таким образом иконка будет всегда на том фоне какой стоит у юзера на раб столе. И вопрос: ты иконку выдираешь откуда, с неба что ли? Иконка уже сохранена, не понимаю что мешает её использовать. И сохранять в отдельный файл, что-то смысла не вижу, раскажи что ты хочешь сделать?
Знать все невозможно, в силу того, что жить бы стало неинтересно.
А. Долматов вне форума Ответить с цитированием
Старый 20.02.2007, 00:47   #3
And1
Пользователь
 
Регистрация: 18.02.2007
Сообщений: 10
Смех Долматову

Спосибо за попытку помочь, А. Долматов. Я наверно не очень точно сформулировал вопрос, потому его трудно понять.

1) У меня нет готовых иконок, у меня есть картинки, каковые я хочу превратить в иконки и добавить в TImageList. Прозрачный цвет я задать могу - это не проблема, но у иконок кроме этого явно существует другая прилада - что-то вроде областей полупрозрачности, с помощью которых обеспечивается плавный переход от непрозрачных областей иконки к полностью прозрачным - благодоря этому при изменении цвета фона, на который наложена иконка, и соответсвенно каковой виден в её прозрачных местах, иконка всё равно смотрится красиво. Без этого эффекта при смене фона например с белого на чёрный, у иконки, нарисованной только для светлого фона, сразу появились бы резкие границы между фоном и непрозрачными областями, что фатально скажется на её внешнем виде - из красивой она превратится в идиотскую. Так как юзер теоретически может установить например и белый фон и чёрный в качестве цвета оконных элементов Windows, без эффекта подобной полупрозрачности становиться бессмысленным использовать иконки с картинками сложных форм, требующих сглаживания (плавного перехода) на цвет фона (окружностями, тругольниками со слишком острыми или слишком тупыми углами и т.д.) . Откуда я знаю, что эффект полупрозрачности или что-то подобное можно задавать у иконок - я наблюдаю это у иконок файлов, видимых в проводнике.

2) Что до сохранения иконки в файл - иконку я беру из системного ImageList - это не мой ImageList, он принадлежит системе, т.е. Windows, а не моей программе, из него можно получать иконки файлов и папок. Так что самих иконок у меня нет - я хотел выдернуть одну иконку из системнго ImageList, сохранить её в файл, и посомтреть, каким образом достигается в ней эффект полупрозрачности. Выдернуть то я её выдернул, но не могу почему-то сохранить её в оригирнальном виде в файл - сохраняется сволочь в 16-ти цветной палитре, хотя на экране отображается минимум в 256-цветной.

Пример, как обеспечить доступ к системному ImageList:
Сначала нужно положить на форму компонент TImageList, затем выполнить следующий код:

ImageList1.Handle:= SHGetFileInfo('C:\', 0, FileInfo, SizeOf(FileInfo), SHGFI_SYSICONINDEX or SHGFI_SMALLICON);

Однако этот ImageList окажется пуст, чтобы в нём появились иконки файлов и папок, необходимо вызыватьфункцию SHGetFileInfo для каждого типа файла или папки, иконку которой нужно получить, например:

var S:String;
var MyFlags:Integer;

S:= 'C:\music\pesnia1.mp3';
MyFlags:= (SHGFI_SYSICONINDEX or SHGFI_SMALLICON or SHGFI_DISPLAYNAME);
SHGetFileInfo(PChar(S),0,FileInfo,S izeOf(FileInfo),MyFlags);

После этого иконка файла pesnia1.mp3, (т.е. иконка файлов типа mp3) будет добавлена в ImageList1. (за основу примера взят код демонстрационного проекта “Virtual ListView”, входящего в состав дистрибутива Delphi5)
And1 вне форума Ответить с цитированием
Старый 17.11.2007, 19:22   #4
Hrumtik
Новичок
Джуниор
 
Регистрация: 17.11.2007
Сообщений: 1
По умолчанию

Интересно было бы узнать как вы решили эту проблему?
Возможно существует наследник TImageList с возможностью использовать иконки в формате png... уж у PNG есть альфа-канал позволяющий использовать полупрозрачность, в отличие от ICO и GIF насколько я понимаю

Всмысле, что TImageList не умеет работать с 32-битными иконками у которых есть альфа канал... а он их автоматически режет до 24-бит, буть то ICO или еще какой.

-----------------------------------------
Нашел тут вариант PngComponents... там есть компонент PngImageList, по-моему он решает проблему

Последний раз редактировалось Hrumtik; 17.11.2007 в 20:18.
Hrumtik вне форума Ответить с цитированием
Старый 17.11.2007, 20:48   #5
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Пример, как обеспечить доступ к системному ImageList
Я сделал по-другому:
Код:
procedure TMyForm.Button1Click(Sender: TObject);
var ind: word;
    t: TIcon;
begin
t:=TIcon.Create;
//индекс иконки, которую будем извлекать
//если задать ind:=-1, получим количество иконок в файле, но тогда
//надо использовать ExtractIcon. Т.е. можно извлечь все в цикле
ind:=0;
if OpenDialog1.Execute then
//получаем копию иконки
t.Handle:=ExtractAssociatedIcon(hInstance, PAnsiChar(OpenDialog1.FileName), ind);
//изначально в ImageList1 уже было 3 иконки, добавляем 4-ю
ImageList1.AddIcon(t);
//присвоим новую, 4-ю иконку нашему приложению (для проверки :) )
ImageList1.GetIcon(3, Application.Icon);
t.Free;
end;

Последний раз редактировалось mihali4; 17.11.2007 в 21:29.
mihali4 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
timage and timagelist RealSHELS Общие вопросы Delphi 3 07.01.2012 08:00
Иконки Killbrum Свободное общение 9 18.08.2008 01:00
TImageList Никки Компоненты Delphi 5 03.08.2008 08:38
Иконки Патрон Общие вопросы Delphi 4 01.04.2008 14:07
иконки MAcK Общие вопросы Delphi 1 17.11.2006 15:56