Как сделать линию в windows forms

Обновлено: 01.07.2024

При рисовании фигур Line и Polyline можно указать форму начальной и конечной точек линии, используя свойства StrokeStartLineCap и StrokeEndLineCap. (Эти свойства не имеют эффекта в других фигурах, поскольку те замкнуты.)

Изначально свойства StrokeStartLineCap и StrokeEndLineCap установлены в Flat, что означает немедленное завершение линии в ее конечных координатах. К другим возможным вариантам относятся Round (линия мягко скругляется), Triangle (обе стороны линии сводятся в точку) и Square (линия завершается четкой границей). Все эти значения добавляют линии длину — другими словами, они выводят ее за ту позицию, в которой она закончилась бы в противном случае. Дополнительное расстояние составляет половину толщины линии.

Единственное отличие между Flat и Square состоит в том, что линии, завершающиеся как Square, просто на половину толщины длиннее с каждой стороны. Во всех остальных отношениях они выглядят одинаково.

Ниже показаны различные варианты концов линий:

Концы линий

Все фигуры, кроме Line, позволяют изменять вид и форму углов через свойство StrokeLineJoin. Здесь существует три варианта: Miter (значение по умолчанию) использует четкие грани, Bevel обрезает угол в точке сопряжения, a Round — плавно скругляет его. На рисунке можно видеть разницу между ними:

Стыки линий

При использовании граней Miter при толстых линиях и очень малых углах может получиться, что угол превышает половину толщины линии. Если вы установите толщину 3, то выступающий угол может в полтора раза превышать толщину линии. В последней линии на рисунке используется большое значение заострения с узким углом.

Пунктирные линии

Вместо рисования скучных сплошных линий на границах вашей фигуры можно использовать пунктирные (dashed) линии — т.е. линии, прерываемые пробелами в соответствии с указанным шаблоном.

При создании пунктирной линии в WPF вы не ограничены определенным набором жестко заданных вариантов. Вместо этого можно выбирать длину сплошного сегмента и длину прерванного сегмента (пробела), устанавливая свойство StrokeDashArray.

Например, рассмотрим следующую линию:

Здесь задана длина сплошного сегмента — 1 и ширина пробела — 2. Эти значения интерпретируются относительно толщины линии. Поэтому если линия имеет толщину 14 единиц (как в данном примере), то сплошная часть будет иметь длину 14 единиц, а ширина пропуска — 28. Линия повторяет этот шаблон на протяжении всей своей длины.

С другой стороны, если поменять местами эти значения, задав их следующим образом:

то получится линия с длиной сплошного участка в 28 единиц и шириной пропуска в 14 единиц. На рисунке показаны обе линии. Несложно заметить, что когда сегмент очень толстой линии приходится на угол, он может быть обрезан неровно:

Пунктирные линии

Можно также использовать и нецелочисленные значения. Например, следующее значение StrokeDashArray вполне допустимо:

Здесь применяется более сложная последовательность — штрих длиной 5x14, затем пробел шириной 0.2x14, за которым идет штрих длиной 3x14 и еще один — длиной 0.2x14. В конце этой последовательности линия повторяет тот же шаблон сначала.

Интересная вещь происходит, когда StrokeDashArray передается нечетное количество значений. Рассмотрим пример:

При рисовании этой линии WPF начинает с линии длиной в 3 толщины, за которой следует пробел в половину толщины линии, за которым идет штрих длиной в 2 толщины. Но когда шаблон повторяется, он начинается с пробела в 3 толщины, за ним идет линия длиной в половину толщины и опять пробел. По сути, пунктирная линия чередует шаблоны между сегментами линии и пробелами.

Если нужно, чтобы шаблон пунктирной линии начинался с его середины, можно применить свойство StrokeDashOffset, которое представляет собой начинающийся с О индекс, указывающий на одно из значений из StrokeDashArray. Например, если установить StrokeDashOffset равным 1 в предыдущем примере, то линия начнется с пробела в половину толщины. Установите 2 — и линия начнется с сегмента в 2 толщины.

И, наконец, можно управлять внешним видом наконечников сегментов линии. Изначально они рисуются как прямой срез, но можно установить значение StrokeDashCap в Bevel, Square и Triangle — смысл этих значений рассматривался в предыдущем разделе. Не забывайте, что все эти настройки добавляют половину толщины линии в конец каждого штриха. Если не принять этого во внимание, можно получить штрихи, которые "наползают" друг на друга. Решение состоит в добавлении ширины пробела, чтобы компенсировать этот эффект.

При использовании свойства StrokeDashCap с линией (но не с фигурой) часто имеет смысл установить StartLineCap и EndLineCap в одно и то же значение. Это сделает внешний вид линии более согласованным.

Как добавить на форму горизонтальную линию (как тег hr)? Есть разные способы. Один из них - создать для этого user control.

  1. Right Click on your project in the Solotion Explorer Window and Select Add New Item.
  2. Select UserControl on the list, select a name to the file and click Add
  3. Now make the class you created look like the code below.
  4. Build the application, the Line Separator should be available on the toolbar

Если же после build'а контрол не появляется в toolbox'е, то нужно сделать следующее. Выбираем меню Tools > Options menu. Там слева ищем Windows Forms Designer (оно снизу) и ставит AutoToolboxPopulate в true. После этого нужно закрыть проект и открыть его заново. Тогда контрол должен появиться.

Есть и такие способы:

To simulate the line in Windows Forms use a Label control. Set its Height to 2 pixels and BorderStyle to Fixed3D. Thats all, see the example.

label1.AutoSize = false;
label1.Height = 2;
label1.BorderStyle = BorderStyle.Fixed3D;

1 комментарий:

VarangaOfficial - варанга развод - мы работаем только с официальными источниками, и предоставляем вниманию наших пользователей исключительно проверенные, не подвергающиеся сомнениям, факты. Воспользовавшись нашим онлайн-сервисом, вы получите возможность узнать исчерпывающую информацию касающуюся представленного средства. Лично увидеть данные о проведенных клинических исследований, прочесть реальные отзывы пациентов и врачей. Изучить инструкцию по использованию, прочесть об особенностях и методах работы мази, уяснить, как работает крем Варанга, где нужно заказывать сертифицированный, оригинальный препарат и, как избежать покупки подделки. Мы тщательно проверяем размещаемые на сайте данные. Предоставляем пользователям нашего ресурса сведения, которые были взяты исключительно из подлинных источников. Если вы обнаружили у себя признаки грибка или уже довольно продолжительное время, без ощутимых результатов стараетесь излечиться от этого неприятного недуга, у нас на сайте вы найдете простой и быстрый способ устранения проблемы. Приобщайтесь и живите здоровой полноценной жизнью. Благодаря нам, все ответы на самые волнующие вопросы, теперь собраны в одном месте на удобной в использовании и высоко информационном ресурсе.

На примере графики наглядно видны преимущества ООП, смысл использования классов, их методов и свойств. Добавляя в пространство имен своего проекта соответствующие библиотеки, вы получаете сразу набор инструментов, необходимых для графики. Это графические примитивы (линии, прямоугольники, эллипсы и т.п.), перо для черчения, кисть для закраски и много других полезных объектов и методов.

Пространство имен System.Drawing (Рисование) обеспечивает доступ к функциональным возможностям графического интерфейса GDI+ , используя около 50 (!) классов, в том числе класс Graphics. Чуть позже мы будем использовать дополнительные пространства имен System.Drawing.Drawing2D, System.Drawing.Imaging, System.Drawing.Printing, System.Drawing.Text, расширяющие функциональные возможности библиотеки System.Drawing.

Класс Graphics предоставляет методы рисования на устройстве отображения (другие термины — графический контекст, «холст»). Определимся сразу, на чем мы хотим рисовать. Далее в примерах он обозначается как объект g.

Способы задания «холста»

3. В принципе, иногда (если все графические операции выполняются внутри одной функции) эти четыре строки могут быть заменены одной строкой:
Graphics g = Graphics.FromImage(new Bitmap(pictureBox1.Width, pictureBox1.Height));
После этого можно задать фон холста белым:
g.Clear(Color.White);

4. Еще один пример задания «холста» на форме через дескриптор окна:
Graphics g = Graphics.FromHwnd(this.Handle);
Далее в примерах конкретизируются эти способы.

Объекты других классов из библиотеки System.Drawing

Класс Pen (перо) используется для рисования линий и кривых, а классы, производные от класса Brush (кисть) используются для закраски замкнутых контуров (см. ниже).

Класс GraphicsPath позволяет задавать последовательность соединенных линий и кривых, класс Region описывает внутреннюю часть графической формы, состоящей из многоугольников и контуров.

Класс Image – абстрактный базовый класс предоставляет функциональные возможности для производных классов Bitmap и Metafile. Bitmap используется для работы с пиксельными изображениями (см. выше пример). Metafile определяет графический метафайл, содержащий записи, описывающие последовательность графических операций, которые могут быть записаны (созданы) и воспроизведены (отображается). Этот класс не наследуется.

Класс Graphics

Он инкапсулирует поверхность рисования GDI+. Этот класс не наследуется. Методов в этом классе огромное количество, поэтому сначала представим их в таблице, а затем рассмотрим некоторые из них с примерами и пояснениями.
В третьем столбце таблицы указывается число перегрузок метода, различающихся набором параметров (используйте интеллектуальную подсказку IntelliSense для выбора нужного Вам варианта метода).

Имя метода Описание Число перегрузок
Clear(Color) Очищает всю поверхность рисования и выполняет заливку поверхности указанным цветом фона. 1
CopyFromScreen(Point, Point, Size) Выполняет передачу данных о цвете, соответствующих прямоугольной области пикселей, блоками битов с экрана на поверхность рисования объекта Graphics. 4
Dispose() Освобождает все ресурсы, используемые данным объектом Graphics. 1
DrawArc(Pen, Rectangle, Single, Single) Рисует дугу, которая является частью эллипса, заданного структурой Rectangle. 4
DrawBezier(Pen, Point, Point, Point, Point) Рисует кривую Безье, определяемую четырьмя структурами Point. 3
DrawBeziers(Pen, Point[]) Рисует несколько (N) кривых Безье, определяемых массивом из (3N+1) структур Point. 2
DrawCloseCurve(Pen, Point[ ]) Рисует замкнутый фундаментальный сплайн 4
DrawEllipse(Pen, Rectangle) Рисует эллипс 4
DrawIcon(Icon, Rectangle) Рисует значок 2
DrawImage(Image image, int x, int y) Рисует заданное изображение image, используя его фактический размер в месте с координатами (x,y) 30
DrawLine(Pen, Point, Point) Проводит линию, соединяющую две структуры Point. 4
DrawLines(Pen, Point[ ]) Рисует набор сегментов линий, которые соединяют массив структур Point. 2
DrawPath(Pen, gp) Рисует пером Pen объект GraphicsPath gp. 1
DrawPie(Pen, Rectangle, Single, Single) Рисует сектор, который определяется эллипсом, заданным структурой Rectangle и двумя радиалtьными линиями. 4
DrawPolygon(Pen, Point[]) Рисует многоугольник, определяемый массивом структур Point. 2
DrawRectangle(Pen, Rectangle) Рисует прямоугольник, определяемый структурой Rectangle. 3
DrawRectangles(Pen, Rectangle[]) Рисует набор прямоугольников, определяемых структурами Rectangle. 2
DrawString(String, Font, Brush, PointF) Создает указываемую текстовую строку в заданном месте с помощью определяемых объектов Brush и Font. 6
Equals(Object) Определяет, равен ли заданный объект текущему объекту. (Унаследовано от Object.) 1
ExcludeClip(Rectangle) Обновляет вырезанную область данного объекта Graphics, чтобы исключить из нее часть, определяемую структурой Rectangle. 1
ExcludeClip(Region) Обновляет вырезанную область данного объекта Graphics, чтобы исключить из нее часть, определяемую структурой Region. 1
FillClosedCurve(Brush, Point[]) Заполняет внутреннюю часть замкнутой фундаментальной кривой, определяемой массивом структур Point. 6
FillEllipse(Brush, Rectangle) Заполняет внутреннюю часть эллипса, определяемого ограничивающим прямоугольником, который задан структурой Rectangle. 4
FillPath(Brush, GraphicsPath) Заполняет внутреннюю часть объекта GraphicsPath. 1
FillPie(Brush, Rectangle, Single, Single) Заполняет внутреннюю часть сектора, определяемого эллипсом, который задан структурой RectangleF, и двумя радиальными линиями. 3
FillPolygon(Brush, Point[]) Заполняет внутреннюю часть многоугольника, определяемого массивом точек, заданных структурами Point. 4
FillRectangle(Brush, Rectangle) Заполняет внутреннюю часть прямоугольника, определяемого структурой Rectangle. 4
FillRegion(Brush, Region) Заполняет внутреннюю часть объекта Region. 1
Flush() Вызывает принудительное выполнение всех отложенных графических операций и немедленно возвращается, не дожидаясь их окончания. 2
IntersectClip(Region) Обновляет вырезанную область данного объекта, включая в нее пересечение текущей вырезанной области и указанной структуры 3
ResetClip() Сбрасывает выделенную область g, делая ее бесконечной 1

Подробнее еще о двух классах.

Класс Pen

Класс Brush

Для первоначального привыкания к стилю ООП в графике рассмотрим первый пример рисования.

Внешний вид приложения является нам преимущественно через формы. Формы являются основными строительными блоками. Они предоставляют контейнер для различных элементов управления. А механизм событий позволяет элементам формы отзываться на ввод пользователя, и, таким образом, взаимодействовать с пользователем.

При открытии проекта в Visual Studio в графическом редакторе мы можем увидеть визуальную часть формы - ту часть, которую мы видим после запуска приложения и куда мы переносим элементы с панели управления. Но на самом деле форма скрывает мощный функционал, состоящий из методов, свойств, событий и прочее. Рассмотрим основные свойства форм.

Если мы запустим приложение, то нам отобразится одна пустая форма. Однако даже такой простой проект с пустой формой имеет несколько компонентов:

Все файлы в Windows Forms

Несмотря на то, что мы видим только форму, но стартовой точкой входа в графическое приложение является класс Program, расположенный в файле Program.cs:

Сама форма сложна по содержанию. Она делится на ряд компонентов. Так, в структуре проекта есть файл Form1.Designer.cs, который выглядит примерно так:

Здесь объявляется частичный класс формы Form1, которая имеет два метода: Dispose() , который выполняет роль деструктора объекта, и InitializeComponent() , который устанавливает начальные значения свойств формы.

При добавлении элементов управления, например, кнопок, их описание также добавляется в этот файл.

Но на практике мы редко будем сталкиваться с этим классом, так как они выполняет в основном дизайнерские функции - установка свойств объектов, установка переменных.

Еще один файл - Form1.resx - хранит ресурсы формы. Как правило, ресурсы используются для создания однообразных форм сразу для нескольких языковых культур.

И более важный файл - Form1.cs, который в структуре проекта называется просто Form1, содержит код или программную логику формы:

Читайте также: