if (isImageClicked == true) {
Pen outline = new Pen(Color.Red, 5);
switch(imageClicked) {
…
case ClickedImage.StrangePath:
g.DrawPath(outline, myPath);
break;
default:
break;
}
}
}
Исходный код.Проект HitTestinglmages размещен в подкаталоге, соответствующем главе 20.
До этого момента все наши приложения, использующие внешние ресурсы (например, файлы изображений), требовали, чтобы загружаемые файлы находились в каталоге приложения. Поэтому для загрузки этих файлов мы использовали их непосредственные имена.
// Загрузка изображений в объекты.
bMapImageA = new Bitmap("imageA.bmp");
bMapImageB = new Bitmap("imageB.bmg");
bMapImageC = new Bitmap("imageC.bmp");
Такая программная логика требует, чтобы каталог приложения содержал три файла с именами imageA.bmp, imageB.bmp и imageС.bmp, иначе в среде выполнения будет сгенерировано соответствующее исключение.
Вы можете помнить из главы 11, что компоновочный блок представляет собой коллекцию типов и, необязательно, ресурсов. В этой связи нашей заключительной темой обсуждения в этой главе будет выяснение того, как выполнить привязку внешних ресурсов (например, файлов изображений и строк) непосредственно к компоновочному блоку. Тогда ваш двоичный блок .NET будет истинно самодостаточным. На элементарном уровне объединение внешних ресурсов в компоновочном блоке .NET предполагает выполнение следующих шагов.
1. Создание файла *.resx в котором задаются пары имен и значений для каждого ресурса приложения в формате XML-представления данных.
2. Использование утилиты командной строки resgen.exe для преобразования XML-файла *.resx в двоичный эквивалент (файл *.resources).
3. Использование флага /resource компилятора C# для того, чтобы встроить двоичный файл *.resources в компоновочный блок.
Как вы можете догадаться, в Visual Studio 2006 эти шаги автоматизированы. Чуть позже вы узнаете, как указанная среда разработки может вам в этом помочь. А пока давайте выясним, как сгенерировать и встроить ресурсы .NET в командной строке.
Пространство имен System.Resources
Ключом к пониманию формата ресурсов .NET является понимание типов, определенных в пространстве имен System.Resources. Соответствующее множество типов обеспечивает программные средства чтения и записи файлов *.resx ( в формате XML) и *.resources (в двоичном формате), а также получения ресурсов, встроенных в компоновочный блок. Описания базовых типов этого пространства имен предлагаются в табл. 20.10.
Таблица 20.10.Члены пространства имен System.Resources
Члены |
Описание |
ResourceReader ResourceWriter |
Позволяют читать и записывать данные двоичных файлов |
ResXResourceReader ResXResourceWriter |
Позволяют читать и записывать данные XML-файлов *.resx |
ResourceManager |
Позволяет программно получить встроенные ресурсы данного компоновочного блока |
Создание файла *.resx программными средствами
Как было отмечено выше, файл *.resx содержит XML-данные, представляющие пары имен и значений для каждого ресурса приложения. Класс ResXResourceWriter предлагает набор членов, с помощью которых вы можете создать файл *.resx, добавить в него двоичные и строковые ресурсы и сохранить их. Для примера мы создадим простое приложение (ResXWriter), которое будет генерировать файл *.resx, содержащий информацию, необходимую для загрузки файла happyDude.bmp (впервые упомянутого в примере DraggingImages) и некоторого строкового ресурса. Графический интерфейс пользователя будет образован единственным типом Button (рис. 20.22).
Рис. 20.22. Приложение ResX
Обработчик события Click для Button добавляет happyDude.bmp и строковый ресурс в файл *.resx, который сохраняется на локальном диске C.
private void btnGenResX_Click(object sender, EventArgs e) {
// Создание объекта, записывающего данные resx,
// и указание файла для записи.
ResXResourceWriter w = new ResXResourceWriter(@"C:\ResXForm.resx");
// Добавление изображения и строки.
Image i = new Bitmap ("happyDude.bmp");
w.AddResource("happyDude", i);
w.AddResource("welcomeString", "Приветствие формата ресурсов");
// Фиксация файла.
w.Generate();
w.Close();
}
Здесь наибольший интерес представляет собой член ResXResourceWriter.AddResource(). Этот метод является перегруженным, чтобы вы имели возможность вставить как двоичные данные (такие, как изображение happyDude.bmp), так и текстовые (наподобие указанной выше строки). Обратите внимание на то, что каждый из вариантов предполагает использование двух параметров: имени соответствующего ресурса в файле *.resx и непосредственно данных. Метод Generate() фиксирует информацию в файле. В результате вы получаете XML-описание ресурсов изображения и строки. Для проверки откройте новый файл ResXForm.resx с помощью текстового редактора (рис. 20.23).
Читать дальше