- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание - Эндрю Троелсен
Шрифт:
Интервал:
Закладка:
Рис. 20.21. Проверка попадания в многоугольники
Этот геометрический образ был создан на форме с помощью метода FillPath() типа Graphics. Указанный метод получает на вход экземпляр объекта GraphicsPath, инкапсулирующий последовательность соединенных линий, кривых и строк. Добавление новых элементов в экземпляр GraphicsPath осуществляется с помощью последовательности связанных методов Add, как описывается в табл. 20.9.
Таблица 20.9. Связанные методы Add класса GraphicsPath
Методы Описание AddArc() Добавляет к имеющейся фигуре эллиптическую дугу AddBezier() AddBeziers() Добавляет к имеющейся фигуре кубическую кривую Безье (или множество кривых Безье) AddClosedCurve() Добавляет к имеющейся фигуре замкнутую кривую AddCurve() Добавляет к имеющейся фигуре кривую AddEllipse() Добавляет к имеющейся фигуре эллипс AddLine() AddLines() Добавляет к имеющейся фигуре сегмент линии AddPath() Добавляет к имеющейся фигуре указанный GraphicsPath AddPie() Добавляет к имеющейся фигуре сектор круга AddPolygon() Добавляет к имеющейся фигуре многоугольник AddRectangle() AddRectangles() Добавляет к имеющейся фигуре прямоугольник (или несколько прямоугольников) AddString() Добавляет к имеющейся фигуре текстовую строкуУкажите using System.Drawing.Drawing2D и добавьте новый член GraphicsPath в класс Form. В рамках конструктора формы постройте множество элементов, представляющих соответствующую траекторию.
public partial class MainForm: Form {
GraphicsPath myPath = new GraphicsPath();
public MainForm() {
// Создание нужного пути.
myPath.StartFigure();
myPath.AddLine(new Point(150, 10), new Point(120, 150));
myPath.AddArc(200, 200, 100, 100, 0, 90);
Point point1 = new Point(250, 250);
Point point2 = new Point(350, 275);
Point point3 = new Point (350, 325);
Point point4 = new Point(250, 350);
Point[] points = {point1, point2, point3, point4};
myPath.AddCurve(points);
myPath.CloseFigure();
…
}
}
Обратите внимание на вызовы StartFigure() и CloseFigure(). При вызове StartFigure() вы можете вставить новый элемент в траекторию, которую вы строите. Вызов CloseFigure() закрывает имеющуюся фигуру и начинает новую (если это требуется). Также следует знать, что в том случае, когда фигура содержит последовательность соединенных линий и кривых (как в случае с экземпляром myPath), цикл завершается путем соединения конечной и начальной точек с помощью линий. Сначала добавьте в перечень ClickedImage дополнительное имя StrangePath.
enum ClickedImage {
ImageA, ImageB,
ImageC, StrangePath
}
Затем обновите имеющийся обработчик события MouseDown, чтобы проверить присутствие указателя мыши в границах GraphicsPath. Как и для типа Region, это можно сделать с помощью члена IsVisible().
protected void OnMouseDown(object sender, MouseEventArgs e) {
// Получение значений (х, у) для щелчка мыши.
Point mousePt = new Point(e.X, e.Y);
…
else if(myPath.IsVisible(mousePt)) {
isImageClicked = true;
imageClicked = ClickedImage.StrangePath;
this.Text = "Вы щелкнули на странной фигуре…";
}
…
}
Наконец, измените обработчик Paint, как предлагается ниже.
private void MainForm_Paint(object sender, PaintEventArgs e) {
Graphics g = e.Graphics;
// Рисование фигуры.
g.FillPath(Brushes.Sienna, myPath);
// Рисование контура (при щелчке на соответствующей фигуре)
if (isImageClicked == true) {
Pen outline = new Pen(Color.Red, 5);
switch(imageClicked) {
…
case ClickedImage.StrangePath:
g.DrawPath(outline, myPath);
break;
default:
break;
}
}
}
Исходный код. Проект HitTestinglmages размещен в подкаталоге, соответствующем главе 20.
Формат ресурсов .NET
До этого момента все наши приложения, использующие внешние ресурсы (например, файлы изображений), требовали, чтобы загружаемые файлы находились в каталоге приложения. Поэтому для загрузки этих файлов мы использовали их непосредственные имена.
// Загрузка изображений в объекты.
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", "Приветствие формата ресурсов");
// Фиксация файла.