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");
      }
  }

Рис. 11.14.

При самостоятельной работе с этой программой в 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, и все. Обратите внимание на значок в верхнем левом углу формы.


Рис. 11.15.

Теперь рассмотрим используемый в программе конструктор 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< Назад | Оглавление | Далее >

Сайт управляется системой uCoz