netlib.narod.ru | < Назад | Оглавление | Далее > |
Выше мы обсудили много способов загрузки растровых изображений из файла для случаев, когда вам требуется вывести конкретную картинку.
Но, как вы знаете, в случае с приложениями, распространяемыми другим пользователям, хранение растровых изображений в отдельных файлах не всегда хорошее решение. Что может произойти, если исполнимый файл программы и растровое изображение будут отделены друг от друга? Чрезмерно усердный пользователь может освобождать пространство на диске, удаляя «ненужные» файлы, и вдруг — бац! — нет больше вашего изображения.
Поэтому зачастую полезно хранить небольшие двоичные файлы (в частности, изображения, значки и нестандартные курсоры) прямо в исполняемом файле приложения. Благодаря этому они не смогут потеряться. Файлы, хранимые в исполняемом файле, называются ресурсами.
В Visual C# .NET для создания двоичных ресурсов имеется интерактивный редактор изображений. Чтобы добавить в программу двоичный ресурс, выберите в меню Project команду Add New Resource. В диалоговом окне Add New Item выберите из расположенного слева списка Categories пункт Resources, а справа — Bitmap File, Cursor File или Icon File. Затем задайте имя файла.
В окне Properties растровых файлов можно указать их размеры и цветовой формат. Устанавливаемый по умолчанию формат файлов курсора — 32 × 32 пиксела, 16 цветов. При рисовании можно также использовать цвета Screen и Reverse Screen. Screen является прозрачным. Он позволяет придать курсору непрямоугольную форму (такую форму имеет большинство курсоров). Reverse Screen инвертирует цвет фона под курсором и используется довольно редко. Вам также следует указать «горячую точку» курсора.
Цветовой формат файлов значков по умолчанию — 16 цветов плюс Screen и Reverse Screen. Screen часто применяется для придания значкам формы, отличной от квадрата. Reverse Screen был очень популярен на заре эры Windows, однако сейчас используется гораздо реже.
Обычно формат создаваемого значка — 32 × 32 пиксела, 16 цветов. Однако значки зачастую отображаются в уменьшенном размере, как квадрат со стороной 16 пикселов. Windows отображает 32-пиксельный значок как 16-пиксельный, удаляя каждый второй столбец и строку пикселов. Если после удаления 75% содержимого ваш значок выглядит не совсем хорошо, создайте его 16-пиксельную версию, которая будет храниться в этом же файле значка. Для переключения между форматами значков в редакторе изображений служит команда New Image Type меню Image.
Теперь о самом важном правиле создания файлов растровых изображений, курсоров или значков, которые станут ресурсами. Сосредоточьтесь.
Если в окне Solution Explorer среды Visual C#. NET выбрать растровое изображение, файл значка или курсора, являющийся частью проекта, становится доступно окно свойств данного файла. Задайте в нем свойству Build Action значение Embedded Resource. Это свойство заставляет Visual C# .NET встроить файл ресурса в .ехе-файл проекта. Для загрузки такого ресурса в программе служит конструктор Bitmap, Cursor или Icon.
Рассмотрим пример с ресурсом-значком. Название проекта — ProgramWithIcon — означает, что имя файла программы — ProgramWithIcon.cs и программа содержит класс ProgramWithIcon. Для рифмы я решил назвать файл значка ProgramWithIcon.ico. Значок изображает картотечный шкаф. Фактически программа только загружает значок и задает значение свойства Icon формы.
ProgramWithIcon.cs
//------------------------------------------------ // ProgramWithIcon.cs (C) 2001 by Charles Petzold //------------------------------------------------ using System; using System.Drawing; using System.Windows.Forms; class ProgramWithIcon: Form { public static void Main() { Application.Run(new ProgramWithIcon()); } public ProgramWithIcon() { Text = "Program with Icon"; Icon = new Icon(typeof(ProgramWithIcon), "ProgramWithIcon.ProgramWithIcon.ico"); } }
При самостоятельной работе с этой программой в Visual C#. NET не забудьте задать свойству Build Action файла значка значение Embedded Resource.
Для загрузки значка используется конструктор класса Icon.
Конструкторы Icon (выборочно)
Icon(Type type, string strResource) |
Другие конструкторы класса Icon позволяют загружать значки из файлов и потоков. Если файл значка или ресурс содержит несколько изображений, можно попробовать получить значок, указывая нужный размер.
Конструкторы Icon (выборочно)
Icon(Icon icon, Size size) |
Icon(Icon icon, int cx, int cy) |
Эти конструкторы не растягивают и не сжимают значки, а пытаются найти доступные значки нужного вам размера. Определить размер значка позволяют свойства класса Icon.
Свойства Icon (выборочно)
Тип | Свойство | Доступ |
Size | Size | Чтение |
int | Width | Чтение |
int | Height | Чтение |
Приведенные ниже методы класса Graphics позволяют вывести значок в клиентской области.
Методы Graphics (выборочно)
void DrawIcon(Icon icon, int x, int y) |
void DrawIcon(Icon icon, Rectangle rect) |
void DrawIconUnstretched(Icon icon, Rectangle rect) |
Программа ProgramWithIcon просто задает свойству Icon формы значение, возвращенное конструктором Icon, и все. Обратите внимание на значок в верхнем левом углу формы.
Теперь рассмотрим используемый в программе конструктор Icon:
new Icon(typeof(ProgramWithIcon), "ProgramWithIcon.ProgramWithIcon.ico")
ProgramWithIcon настолько часто появляется в проекте и в этой инструкции, что трудно сказать, что есть что. В связи с этим мы подробно проанализируем конструктор.
Первый аргумент конструктора — это класс ProgramWithIcon. В операторе typeof можно применить имя любого класса, определенного в программе. Кроме того, можно использовать имя любой определенной в программе структуры, перечисления, интерфейса или делегата.
В любой части кода класса ProgramWithIcon выражение:
typeof(ProgramWithIcon)
аналогично:
this.GetType()
или, если проще:
GetType()
Такая эквивалентность позволяет сократить конструктор до:
new Icon(GetType(), "ProgramWithIcon.ProgramWithIcon.ico")
с сохранением полной работоспособности программы.
Второй аргумент конструктора Icon — имя файла. Например, если имя файла значка MyIcon.ico, конструктор Icon будет выглядеть так:
new Icon(GetType(), "ProgramWithIcon.MyIcon.ico")
Первая часть имени в кавычках называется пространством имен (namespace), однако это пространство имен ресурса. Не путайте его с пространством имен .NET Framework. По умолчанию Visual C# .NET называет это пространство имен ресурса так же, как проект. Но ему можно задать и другое название, изменив значение свойства Default Namespace в диалоговом окне Property проекта. Заданное имя должно соответствовать первой части заключенного в кавычки имени в конструкторе Icon. Свойству Default Namespace можно даже задать пустое значение; при этом вторым аргументом конструктора Icon станет только имя файла:
new Icon(GetType(), "ProgramWithIcon.ico");
или MyIcon.ico, или любое другое.
При запуске компилятора C# из командной строки для каждого ресурса применяется ключ /res. Например, при использовании ключа компилятора:
/res:ProgramWithIcon.ico
значок загружается так
new Icon(GetType{), "ProgramWithIcon.ico")
Кроме того, значку можно задать расширенное имя, указав его через запятую после имени файла:
/res:ProgramWithIcon.ico,ProgramWithIcon.ProgramWithIcon.ico
Загрузить такой значок позволяет конструктор:
new Icon(GetType(), "ProgramWithIcon.ProgramWithIcon.ico")
При использовании пространства имен ресурса по умолчанию, которое среда Visual C# .NET назначает вашему проекту, возможна проблема. Например, вы создали проект ProgramWithIconPlus, в котором класс ProgramWithIconPlus наследует параметры класса ProgramWithIcon. В проекте вы также создали новый файл ProgramWithIconPlus.cs и добавили ссылку на существующий файл ProgramWithIcon.cs. Однако создавать новый значок для новой программы вы не стали, а сделали в проекте ProgramWithIconPlus ссылку на файл ProgramWithIcon.ico. Конструктор в классе ProgramWithIcon по-прежнему будет загружать значок. А если значок попытается загрузить программа ProgramWithIconPlus? Она аварийно завершит работу, сгенерировав исключение. Что же происходит? Оператор конструктора класса ProgramWithIcon, загружающий значок, выглядит так:
Icon = new Icon(typeof(ProgramWithIcon), "ProgramWithIcon.ProgramWithIcon.ico");
Однако пространство имен ресурса по умолчанию для программы ProgramWithIconPlus — это ProgramWithIconPlus, а не ProgramWithIcon. Каково простейшее решение проблемы? Изменить значение свойства Default Namespace проекта ProgramWithIconPlus на ProgramWithIcon. Или задать всем свойствам Default Namespace пустые значения и использовать в конструкторе только имя файла.
Курсор загружается так же, как и значок. Конструктор Cursor выглядит так:
Конструкторы Cursor (выборочно)
Cursor(Type type, string strResource) |
О конструкторе класса Bitmap я уже упоминал.
Конструкторы Bitmap (выборочно)
Bitmap(Type type, string strResource) |
Давайте разбираться с конструктором Bitmap.
netlib.narod.ru | < Назад | Оглавление | Далее > |