Шаг 57 - Компонент TImageList

Этот компонент инкапсулирует соответствующий элемент управления Windows под названием IMAGELIST. На первый взгляд - по большому счету, зачем нужны специальные списки для хранения изображений? Вроде легче использовать встроенные списочные классы - у C++ это чаще всего vector, у Delphi TList. Но БГ привел эти списки к системному значению. Например, элементы дерева хранятся в IMAGELIST, изображения вкладок TabControl. Даже картинки с иконками хранятся в специальном списке - называется системный IMAGELIST.

Надо так надо. Как же с ним работать? При двойном щелчке на компоненте открывается окошко:

gif/57_1.gif (5036 b)

Здесь как бы все должно быть интуитивно понятно :), значит идем дальше. Обычно бывает понятие выделенных, имеющих фокус, не имеющих фокуса и прозрачных элементов. Это состояние отражается на выводе текста и картинки (если она, конечно, есть...). Эта дополнительная функция (помимо основной - хранения указателей на графические объекты) обеспечивается свойствами BkColor, BlendColor, DrawingStyle. Правдо, все это хозфйство работает, только если с изображениями имеются маски - черно-белые изображения, определяющий белым цветом выводимые области, а черным - скрытые. Если не ошибаюсь :). Монохромные маски чаще всего используются при выводе спрайтов - фигур, имеющих произвольную прозрачность в зависимости от формы.

Все эти состояние - выделен, фокусирован, невидим - зависят от маски. BlendColor - определяет цвет видимой части, BkColor - невидимой. Если элемент выделен, то BlendColor затемняет его наполовину. Если фокусирован - на четверть. Если невидим - вместо невидимой части выводится BkColor. DrawingStyle can be one of the following values - (что-то на второй неродной потянуло :)) - dsFocused, dsSelected, dsNormal, dsTransparent. Все, о чем я говорил.

Все методы добавления и экстракции типичны, думаю, по ним вопросов не должно быть. Скажу только, что TImageList может хранить матрицы и иконки. Предполагается, что иконка изначально маскирована. Маска к матрице может добавляться только во время выполнения методом Add. Второй параметр - маска может быть равен NULL.

Более подробно будут каждый раз рассматриваться специфичные области IMAGELIST - использование TreeView, ListView. Не очень в ряд здесь будет shell's namespace. Впрочем, кому как. Забавные вещи можно вытворять. Я один раз ради интереса присвоил TImageList::Handle объекту Handle системного списка. Программу закрыл, она у меня ради интереса все иконки освободила, в смысле, память под них. Открываю я ихСплорер, а там ни одной иконки. Между прочим, все быстрее работать стало... Кстати, автоматическое освобождение происходит от свойства ShareImages.

Это было отступление.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Аванесов Самвел.