При рисовании фигур на поверхности Graphics нам придется оперировать двумя понятиями: линия и заливка. Эти понятия чаще всего ассоциируют с карандашом и кистью соответственно. С помощью карандаша мы рисуем линии, а с помощью кисти заполняем пространства (раскрашиваем). Например, линия прямоугольника может быть черного цвета, а внутренность прямоугольника может заполняться другим цветом.
Наверное, каждый графический редактор оперирует этими же двумя понятиями. Откройте, например, графический редактор Paint и посмотрите на панель выбора цвета. Мы работаем сразу с двумя цветами: пера и кисти. Один цвет выбирается левой кнопкой мыши, а другой — правой кнопкой.
За стиль карандаша в .NET отвечает класс Pen. Для иллюстрации самых интересных свойств этого класса я написал небольшой пример, который мы сейчас и рассмотрим (листинг 13.1). В нем несколько линий рисуются различными перьями.
Листинг 13.1. Рисование линий разными перьями
private void Form1_Paint(object sender, PaintEventArgs e) { Color c1 = Color.FromName("Green"); Pen pen = new Pen(c1, 3); // стили карандаша int x = 10; foreach (DashStyle dcp in Enum.GetValues(typeof(DashStyle))) { pen.DashStyle = dcp; e.Graphics.DrawLine(pen, new Point(x, 10), new Point(x, 100)); x += 10; } // ваш собственный рисунок x += 50; pen.DashPattern = new float[] { 5.0F, 1.0F, 2.0F, 4.0F, 1.0F, 10.0F }; e.Graphics.DrawLine(pen, new Point(x, 10), new Point(x, 100)); // смещение рисунка x += 50; for (int i = 0; i < 5; i++) { pen.DashOffset = i; e.Graphics.DrawLine(pen, new Point(x, 10), new Point(x, 100)); x += 10; } }
Программа просто рисует линии, при этом изменяется стиль карандаша, что делает линии уникальными. Давайте рассмотрим этот код подробнее, чтобы понять, что происходит.
В первой строке кода создается переменная для хранения цвета. Хотя цвет будет использоваться только во второй строке кода, я решил написать создание цвета явно в отдельной строке. Просто так захотелось.
Во второй строке инициализируется карандаш в виде объекта класса Pen. Конструктор принимает два параметра:
В качестве толщины я выбрал троечку, чтобы линии было лучше видно.
Далее идут три блока кода, которые отделены не только пустой строкой и комментарием, но и смыслом выполняемых действий. В первом блоке кода с помощью цикла foreach перебираются все значения перечисления DashStyle. Одноименное свойство есть у карандаша, и оно отвечает за стиль линии. Существуют шесть стилей: Solid, Dash, Dot, DashDot, DashDotDot, Custom, и соответствующие шесть линий вы можете увидеть на рис. 13.1, слева. Обратите внимание, что 5-я и 6-я линии одинаковы. Это потому, что Custom не имеет стиля, но вместо этого позволяет пользователю задавать свой стиль, что и происходит во втором блоке кода примера.
Итак, второй блок создает свой стиль. Это делается через свойство DashPattern, которое имеет тип массива значений float. Каждое значение в этом массиве — это значение длины линии и пробела поочередно. Это значит, что первое число задает длину линии, второе — длину пробела, потом опять линии и т. д. Таким образом, вы можете создать свой собственный рисунок линии.
Последний блок кода рисует пять линий в цикле, постепенно увеличивая свойство DashOffset. Это свойство отвечает за смещение в линии, начиная с которого будет создаваться рисунок карандаша. Мне сложно передать словами смысл смещения — лучше всего это передают последние пять линий на рисунке.