Загрузка битового образа из ресурса программы



 

Загрузка изображений в битовые образы из файлов не всегда удобна. Однако Visual Studio позволяет поместить необходимые битовые образы в виде ресурса в файл исполняемой программы и по мере необходимости загружать битовые образы из ресурса.

С каждой формой в проекте автоматически связывается файл ресурсов (рис. 1). При добавлении ресурсов на форму или элемента управления (например, фонового изображения) этот файл будет изменяться автоматически. Не следует менять его содержимое вручную.

 

Рис. 1. Файл ресурсов формы (фрагмент структуры проекта из окна Solution Explorer)

 

Для хранения собственных ресурсов можно использовать файл ресурсов проекта Resources . resx (рис. 2), который принадлежит пространству имён ProjectName.Properties, или создать новый файл ресурсов.

Файл ресурсов добавляется в проект через меню Project\Add New Item... (или сочетание клавиш Ctrl+Shift+A). В появившемся окне нужно выбрать Resources file и задать имя (рис. 3).

Рис. 2. Файл ресурсов проекта (фрагмент структуры проекта из окна Solution Explorer)

 

Рис. 3. Окно добавления нового элемента

 

Созданный файл ресурсов отображается в окне Solution Explorer . При двойном щелчке на этом файле откроется вкладка редактирования файла ресурсов. Добавить новое изображение (в данному случае, формата BMP) можно через меню Add Resource\New Image\BMP Image (рис. 4). Откроется вкладка для редактирования созданного изображения, представляющая простой графический редактор.

 

Рис. 4. Добавление нового графического изображения в качестве ресурса

 

В файл ресурсов можно также добавлять уже существующие файлы, текстовые строки, звуковые файлы, пиктограммы. Для переключения между видами ресурсов используется выпадающий список, на рис. 4 имеющий значение Images. После добавления ресурса в пространстве имён проекта создается класс с именем, соответствующим имени RESX-файла, и содержащим поля, соответствующие ресурсам и доступные только для чтения.

У каждого из ресурсов имеется свойство Persistence, которое указывает, является ли данный ресурс внедрённым или связанным, и принимает значения, соответственно, Embedded in . resx и Linked at compile time. Связанные ресурсы хранятся в виде файлов в проекте, а в RESX-файле хранится относительный путь к файлу. В случае внедрённых ресурсов данные ресурсов хранятся непосредственно в RESX-файле. Но, в любом случае, данные ресурсов компилируются в исполняемый файл. Обычно следует использовать связанные ресурсы, поскольку они просты в использовании. По умолчанию все новые ресурсы являются связанными, а не внедрёнными.

Внедрённые ресурсы являются наилучшим решением, если необходимо совместно использовать файлы ресурсов в нескольких проектах. Например, при наличии общего файла ресурсов с логотипами организации, сведениями о товарном знаке и т.п. использование внедрённых ресурсов означает, что достаточно скопировать только файл .resx и не сопоставлять файлы данных ресурсов. Внёдренные ресурсы нельзя редактировать непосредственно. При попытке изменить внедренный ресурс появится сообщение, предлагающее преобразовать элемент в связанный ресурс, чтобы его отредактировать (рис. 5).

 

Рис. 5. Запрос на преобразование внедрённого ресурса в связанный

 

Работать с изображением, хранящимся в файле ресурсов, можно как с обычным объектом типа Bitmap. В следующем примере осуществляется рисование на поверхности формы изображения, хранящегося в файле ресурсов. Файл ресурсов назван resBMP . resx и содержит изображение ImageExample.

 

canvas.DrawImage(resBMP.ImageExample, 10, 10);

 

Двойная буферизация

 

Другим очень важным способом применения образов является специальная техника графического программирования, называемая двойной буферизацией. Иногда изображение, которое необходимо создать, оказывается очень сложным и даже современным быстродействующим компьютерам может потребоваться значительное время для его создания. При использовании этого способа процедура рисования осуществляется не в окне, а в некотором битовом образе, и, только после того как рисование завершено, этот образ переносится в окно.

В следующем примере рисуется большое количество линий цветом, выбираемым случайным образом. При его запуске процедура рисования хорошо видна.

 

using (Graphics canvas = this.CreateGraphics())

{

Random rndValue = new Random();

for (int x = 0; x < ClientRectangle.Width; x++)

{

for (int у = 0; у < ClientRectangle.Height; у+= 10)

{

Color lineColor = Color.FromArgb(rndValue.Next(255),
rndValue.Next(255), rndValue.Next(255));

using (Pen linePen = new Pen(lineColor, 1)) {
canvas.DrawLine(linePen, new Point(0, 0), new Point(x, у)); }

}

}

}

 

При использовании приёма двойной буферизации все выполняемые графические операции остаются теми же самыми. Единственное отличие заключается в том, что теперь их результат будет заноситься в образ, а не выводится непосредственно в окно.

 

using (Graphics canvas = this.CreateGraphics()) {

Bitmap canvBitmap = new Bitmap(ClientRectangle.Width, ClientRectangle.Height);

Graphics bitmapCanvas = Graphics.FromImage(canvBitmap);

// Программный код первого примера...

... ... ...

canvas.DrawImage(canvBitmap, ClientRectangle); }

 

Поскольку все линии сначала заносятся в образ, который является невидимым, то прежде чем их можно будет увидеть на экране, должно пройти некоторое время.


Дата добавления: 2019-03-09; просмотров: 182; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!