 |  | |  | |
Петр Смирнов дата публикации 16-02-2007 02:46 TProgressBar с поддержкой скинов
Многим из программистов приходилось отображать прогресс выполнения не некоторого абстрактного процесса, а реального, например - заполнения емкости с жидкостью. Ряд программ используют специализированные компоненты для отображения прогресса, достаточно взглянуть на известный всем WinRAR. В интернете есть огромное количество компонентов, которые позволяют сделать TProgressBar похожим на используемые в известных программах ProgressBarы. Примеры можно найти здесь (прямая ссылка для скачивания). Все компоненты распространяются бесплатно, подробности можно посмотреть на сайте.Тем не менее, в ряде вопросов, например »вопрос КС №37317« (требуется красивый ProgressBar) »вопрос КС №37051« »вопрос КС №39981« (желательно визуальное сходство с физическим прибором) возникают проблемы, связанные с нехваткой подобных компонентов. Мне тоже требовался "градусник" в виде градусника простите за тавтологию, я не нашел ничего лучшего, чем создать свой собственный компонент, который я собственно и предлагаю на рассмотрение.
Возможности: - прямоугольный ProgressBar с любым направлением роста прогресса: слева направо (стандартный), снизу вверх (заполнение сосуда или градусник), сверху вниз ("занавес"), справа налево (не знаю для чего, сами придумаете назначение)
- два круглых стиля с ростом прогресса против часовой стрелки (при этом "начало координат" направлено на 3 часа) и по часовой стрелке (при этом начало координат направлено на 9 часов). Центр вращения при этом может задаваться свойствами Center*
- В качестве "фона" (неактивной области) и "заливки" (активной области) может использоваться как цвет (как в обычном ProgressBar), так и картинка (чего в обычном ProgressBar нет).
- При использовании картинок, Вы можете использовать маску, черно-белую картинку, которая показывает, какую именно часть картинки следует делать активной (это видно в примере с колбой). Прямоугольную маску можно задавать установкой свойств Offset****
- при изменении размера компонент автоматически масштабирует картинки, рамку и маску
- Вам не нужно таскать никаких дополнительных картинок с собой, все будет "вкомпилировано" в EXE файл (разумеется, его размер при этом вырастет!)
- Поддерживаются те же типы картинок, что и у TImage (то есть вы можете использовать, например GIF установив библиотеку GraphicEx)
- интерфейс для программиста приближен к используемому в TProgressBar
- Компонент проверен на работоспособность в Delphi 5.5, 6.0, 7.0
- + (нововедение от 2.02.08) - полупрозрачность - пикселы, закрашенные указанным, цветом не отображаются. Введено по просьбе пессимистов, считавших, что переделывать компонент придется процентов на 90 (смотрите обсуждение). Реально же вся доработка свелась к примерно десяти новым строчкам кода ВООБЩЕ без модификации прежнего.
 Описание образцов: - "Занавес", картинки не используются, только цвета.
- Заполнение снизу вверх "колбы". Используется маска и оба типа картинок (активный и неактивный).
- "Эквалайзер" - один из тех "столбиков", что показывают интенсивность сигнала на многих музыкальных центрах. Создать такое с помощью стандартных компонентов за столь малое время (~3-5 минут) затруднительно.
- Для примера - стандартный TGauge. Единственный плюс - отображает прогресс в числовом виде, в моем компоненте это не реализовано, так как за образец был взят TProgressBar
- Эллиптический стиль, вращение против часовой стрелки, вновь использованы только цвета, близкие к стандартным
- Вновь эллиптический стиль, вращение по часовой стрелке, но теперь использована фоновая картинка и маска. Активная область выделяется синим цветом.
- Эллиптический стиль, вращение против часовой стрелки, все остальное - как в образце 2
- Стандартный "круглый" TGauge. TProgressBar даже не умеет быть круглым.
- Простой линейный прогресс, раскрашенный под 16-цветную палитру.
- стандартный TProgressBar, не выдерживающий конкуренции по сравнению с моим компонентом для красивых приложений.
Демонстрация показывает, как я сам предлагаю использовать его. Плохое качество использованных картинок обусловлено желанием сделать небольшой размер исполняемого файла (плюс к тому я плохой дизайнер), компонент успешно работает и с картинками с глубиной цвета 32 бита. При создании компонента не были использованы сторонние компоненты, а также чужой исходный код. Полупрозрачность в демонстрациях не используется, так как я не считал, что это свойство вообще должно было присутствовать, но решил показать, как ее можно сделать очень простым способом - использованием TransparentBlt. По умолчанию компонент выставляет свойство TransparentColor в clNone, что соответствует выключенной полупрозрачности. Внимание! Вполне очевидный недостаток, связанный с полупрозрачностью таится, если цвет TransparentColor присутствует внутри заполняемой части рисунка. Дело в том, что весь рисунок, заполненный TransparentColor просто не отображается (и это нормально), но если компонент заполняется неоднократно, то... уже заполненная область, покрытая активной картинкой и, соответственно, отображенная, больше никогда не сотрется (до перерисовки компонента-родителя TPictureBar, как правило, это форма). Например, пусть у нас есть колба и она заполняется, а мы сделали TransparentColor=clWhite. Первый раз все будет замечательно, а потом мы не увидим заполнения. Почему? Все просто. Дело в том, что белый цвет, которым должна по первоначальному замыслу заполниться колба при сбросе является полупрозрачным и не отображается. А на канве остается старый - синий цвет. Это очень опасный момент использования полупрозрачности - следите за этим. Конечно, можно сделать еще и запоминание задника и перерисовку его, когда это потребуется, но это приведет к неоправданному усложнению компонента. Компонент полностью бесплатен для любого использования. С удовольствием выслушаю Ваши пожелания относительно расширения функциональности компонента.
К материалу прилагаются файлы:
[TProgressBar] [Фоновые рисунки, прозрачность, скины ]
Обсуждение материала [ 19-03-2007 20:35 ] 10 сообщений |
|