При рисовании фигур на поверхности 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. Это свойство отвечает за смещение в линии, начиная с которого будет создаваться рисунок карандаша. Мне сложно передать словами смысл смещения — лучше всего это передают последние пять линий на рисунке.