netlib.narod.ru | < Назад | Оглавление | Далее > |
В главе 12 мы начнем работать с элементами управления, в частности, с кнопками, метками и полосами прокрутки, а затем — с меню, списками, редактируемыми полями и т.д. Вы увидите, что на поверхности элемента управления в дополнение к тексту или вместо него можно размещать растровые изображения. И высший пилотаж: панели инструментов под меню приложений обычно состоят из строки небольших растровых изображений.
В пространстве имен System.Windows.Forms есть класс ImageList, упрощающий работу с наборами изображений. Список изображений — это гибкий массив объектов Image одинакового размера и цветового формата. Добавление изображений в объект ImageList (при помощи процесса, о котором я вкратце расскажу ниже) и доступ к ним аналогичны работе с массивом. При добавлении в объект ImageList изображениям не обязательно иметь одинаковый размер, и все же при извлечении из этого объекта они будут приведены к одному размеру.
Вот самые важные свойства класса ImageList.
Свойства ImageList (выборочно)
Тип | Свойство | Доступ |
Size | ImageSize | Чтение/запись |
ColorDepth | ColorDepth | Чтение/запись |
Color | TransparentColor | Чтение/запись |
ImageList.ImageCollection | Images | Чтение |
Устанавливаемое по умолчанию значение свойства ImageSize — квадрат со стороной 16 пикселов; при добавлении изображений в список оно не изменяется автоматически. Возможно, вам потребуется задать его самостоятельно на основе размера добавляемых объектов Image и, вероятно, разрешения дисплея, с использованием которого выполняется программа.
Свойство ColorDepth — это член перечисления ColorDepth.
Перечисление ColorDepth
Член | Значение |
Depth4Bit | 4 |
Depth8Bit | 8 |
Depth16Bit | 16 |
Depth24Bit | 24 |
Depth32Bit | 32 |
По умолчанию для свойства ColorDepth устанавливается значение Depth8Bit, и его требуется изменять вручную в зависимости от используемых изображений. К счастью, перечисление ColorDepth определено довольно рационально. Благодаря этому, если у вас есть объект Image (например, с именем image), который нужно поместить в список изображений, можно методом Image.GetPixelFormatSize получить формат его пикселов и число бит на пиксел и затем преобразовать результат в значение типа ColorDepth.
imglst.ColorDepth = (ColorDepth)Image.GetPixelFormatSize(image.PixelFormat);
Знаю, что четвертое свойство с именем Images выглядит несколько устрашающе, так как его тип определен как ImageList.ImageCollection. Длинное имя означает лишь то, что это класс ImageCollection, определенный в классе ImageList. Обращаться к классу ImageCollection в приложении не нужно: чтобы задействовать его свойства и методы, достаточно сослаться на свойство Images — именно в нем хранятся все изображения объекта ImageList.
Функциональность свойства Images проявляется в ряде других классов пространства имен System.Windows.Forms. В главе 12 обсуждается свойство Controls класса Control, тип которого — Control.ControlCollection. В главе 14 — свойство MenuItems класса Menu с типом Menu.MenuItemCollection. Все эти свойства работают примерно одинаково. Типы всех этих свойств реализуют интерфейсы IList, ICollection и IEnumerable (определенные в пространстве имен System.Collections), которые позволяют данным свойствам работать как расширяемым массивам.
Для создания объекта типа ImageList вызывается конструктор по умолчанию.
ImageList imglst = new ImageList();
Затем задаются значения свойств ImageSize и ColorDepth. Добавить объекты Image в список изображений позволяет один из следующих методов:
Методы ImageList.ImageCollection (выборочно)
void Add(Image image) |
void Add(Image image, Color clrTransparent) |
void Add(Icon icon) |
void AddStrtp(Image image) |
Поскольку эти методы определены в классе ImageList.ImageCollection, вызвать их можно через свойство Images объекта ImageList. На самом деле все гораздо проще, чем кажется:
imglist.Images.Add(image);
Каждому добавляемому изображению назначается индекс, начиная с 0. Метод AddStrip добавляет несколько изображений, число которых зависит от ширины передаваемого методу изображения и ширины, определяемой свойством ImageSize.
Следующее свойство указывает число изображений в объекте ImageList.
Свойства ImageList.ImageCollection (выборочно)
Тип | Свойство | Доступ |
int | Count | Чтение |
Свойство Count можно использовать в выражениях так:
imglst.Images.Count
Гораздо важнее то, что к свойству Images можно обращаться, как при работе с массивом. Выражение:
imglst.Images[2]
возвращает третий объект Image из списка изображений. Если список включает менее трех изображений, выражение вызывает исключение. Кроме того, индексы позволяют заменить изображение в списке:
imglst.Images[3] = image;
Если же в списке меньше четырех изображений, это выражение вызовет исключение.
Можно также определить, присутствует ли конкретное изображение в списке, и получить его индекс.
Методы ImageList.ImageCollection (выборочно)
bool Contains(Image image) |
int IndexOf(Image image) |
Например, выражение:
imglst.Images.IndexOf(image)
возвращает 2, если объект image — третий в списке, и -1, если его в списке нет.
Из списка можно удалять как отдельные, так и все изображения:
Методы ImageList.ImageCollection (выборочно)
void RemoveAt(int index) |
void Clear() |
Как рассказывается в следующих главах, объект ImageList можно использовать совместно с различными элементами управления, в частности, с элементом управления ToolBar. Сам по себе ImageList — это удобный способ хранения нескольких изображений одинакового размера. Для вывода этих изображений класс ImageList предоставляет метод Draw.
Методы Draw класса ImageList
void Draw(Graphics grfx, Point pt, int index) |
void Draw(Graphics grfx, int x, int y, int index) |
void Draw(Graphics grfx, int x, int y, int cx, int cy, int index) |
Заметьте: индекс изображения в списке — последний аргумент. Например, выражение:
imglst.Draw(grfx, x, y, 1)
выводит второе изображение из списка.
Обращайте особое внимание на координаты, передаваемые методам Draw. Первые два метода принимают координаты точек в единицах измерения устройства (пикселах). Размер изображения основывается на свойстве ImageSize объекта ImageList и измеряется в пикселах. На эти два метода не влияют ни преобразование страницы, ни мировое преобразование! Координаты устройства предназначены для максимизации производительности, но на принтерах это приводит к эффекту почтовой марки. Третий метод Draw принимает координату, а также ширину и высоту в мировых координатах.
netlib.narod.ru | < Назад | Оглавление | Далее > |