Категории
Самые читаемые
onlinekniga.com » Компьютеры и Интернет » Программирование » ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание - Эндрю Троелсен

ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание - Эндрю Троелсен

Читать онлайн ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание - Эндрю Троелсен

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 184 185 186 187 188 189 190 191 192 ... 259
Перейти на страницу:

Рис. 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", "Приветствие формата ресурсов");

 // Фиксация файла.

1 ... 184 185 186 187 188 189 190 191 192 ... 259
Перейти на страницу:
На этой странице вы можете бесплатно читать книгу ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание - Эндрю Троелсен.
Комментарии