Как рисовать в windows forms c

Обновлено: 01.07.2024

Используя данный пример, можно создавать собственные программы для построения графиков других функций. По желанию можно модернизировать работу программы по своему усмотрению.

Содержание

Поиск на других ресурсах:

Условие задачи

Задана формула функции двух переменных z = sin(x) + cos(y) . Разработать приложение, которое рисует график этой функции в отдельной форме.

Дополнительно реализовать поворот графика влево, вправо, вверх, вниз. Также нужно выводить оси OX , OY , OZ .

Математическая постановка задачи

Построение графика функции двух переменных есть математически решаемой задачей, в которой используются известные формулы вычисления.

График функции двух переменных z(x,y) строится в параллелепипеде с размерами (xx1, xx2) , (yy1, yy2) , (zz1, zz2) .

Для использования поворота системы в 3-мерном пространстве возникает понятие точки ( x0 , y0 , z0), относительно которой происходит поворот системы координат.

Также возникает понятие углов:

    (альфа) – поворот системы относительно оси OZ ; (бета) – поворот системы относительно оси OX .

Сдвиг в точку ( x0 , y0 , z0 ) с учетом поворота на углы и описывается известными соотношениями

Преобразования координат 3D Формулы

После перемножения матриц получаем формулу для вычисления:

02_02_00_013_formula_02

По этой формуле будет происходить преобразование системы координат и масштабирование (рисунок 1).

Рисунок. Сдвиг и поворот системы координат

Рис. 1. Сдвиг и поворот системы координат

Необходимо определиться, в какой плоскости монитора будут лежать оси координат OX , OY , OZ . Принимаем, что в плоскости монитора лежат оси OX и OY . А ось OZ перпендикулярна экрану.

Координаты расчетной точки (x, y) прижимаются к точке (0, 0) по формулам:

где A , a – коэффициенты перспективы, которые подбираются экспериментально в зависимости от функции.

Выполнение

1. Создание проекта как Windows Forms Application

2. Создание формы Form1 .

Создать форму по образцу, как показано на рисунке 2.

Настроить следующие свойства компонент и формы:

3. Создание формы Form2 .

Создать новую форму. Подробный процесс создания новой формы описывается здесь .

Разместить на форме четыре компонента типа Button. Автоматически создается четыре объекта с именами button1, button2, button3, button4.

Настроить свойства компонент и формы следующим образом:

Приблизительный вид формы Form2 изображен на рисунке 3.

4. Ввод внутренних переменных в форму Form2 .

Все внутренние переменные, использующиеся для организации вывода графика, размещаются в классе формы Form2. Поэтому, сначала надо активизировать модуль « Form2.pas ».

В модуль формы Form2 вводятся следующие внутренние переменные с классом видимости private:

  • xx1, xx2, yy1, yy2 – соответствуют координатам точек, которые отображаются на экране монитора;
  • массивы xx и yy предназначены для вывода плоскости из 4-х точек. Область определения функции z = f(x, y) разбивается на прямоугольники, на любом из которых функция экстраполируется ребрами четырехугольника.

В разделе public вводятся:

  • переменные X_min , Y_min , X_max , Y_max вещественного типа, которые представляют реальные координаты параллелепипеда, в котором выводится график функции. Эти переменные заполняются из основной формы Form1 экспериментальным путем:
  • переменные alfa, beta вещественного типа, которые отображают углы наблюдения за графиком функции. Заполняются из главной формы Form1;
  • переменные x0, y0, z0 вещественного типа. Отображают величины из главной формулы вычисления (см. математическую постановку задачи);
  • переменная A вещественного типа. Представляет коэффициент перспективы и подбирается экспериментально;
  • переменная f_show логического типа используется для указания того, что нужно перерисовать график, в случае изменения положения углов alfa и beta.

После введения переменных в текст программы, фрагмент класса формы Form2 имеет вид:

Переменные, имеющие идентификатор доступа public, заполняются из формы Form1 .

5. Программирование внутренних методов в форме Form2 .

В текст класса Form2 вводятся три дополнительных метода:

  • функция преобразования системы координат и масштабирования Zoom_XY() ;
  • функция func() для которой выводится график;
  • функция рисования графика Show_Graphic().

Листинг метода преобразования системы координат следующий:

Листинг метода func() следующий.

В этом методе вместо строки

можно сделать вставку собственной функции.

Непосредственный вывод графика функции реализован в методе Show_Graphic() . Листинг метода Show_Graphic() следующий.

Объясним некоторые фрагменты кода в методе Show_Graphic().

Область определения функции z = f(x,y) разбивается на прямоугольники, на любом из которых функция экстраполируется с ребрами четырехугольника. Построение четырехугольников на экране реализуется с помощью метода DrawLine().

После очистки канвы происходит рисование осей координат и методом DrawLine() выводятся фрагменты поверхности.

При рисовании поверхности, из метода Show_Graphic() вызывается метод Zoom_XY(), что осуществляет преобразование и масштабирование из реальных координат в экранные координаты.

6. Программирование события Paint формы Form2.

Обработчик события Form2_Paint() получает два параметра. Первый параметр типа System.Object , второй параметр типа PaintEventArgs .

Параметр типа PaintEventArgs содержит объект Graphics, необходимый для рисования на поверхности формы.

Листинг обработчика события Form2_Paint() следующий.

7. Программирование обработчиков событий клика на кнопках button1, button2, button3, button4.

Поворот графика происходит в момент, когда пользователь делает клик на одной из кнопок, размещенных на форме Form2 (элементы управления button1, button2, button3, button4).

Отображение графика зависит от внутренних переменных alfa и beta. Переменная alfa содержит угол поворота относительно оси OZ . Переменная beta содержит значение угла поворота вокруг оси OX .

Поэтому, в обработчиках событий происходит изменение значений alfa и beta на некоторую величину. По желанию, можно установить собственную величину изменения alfa и beta.

Листинг обработчиков событий приведен ниже.

В вышеприведенных обработчиках событий, событие Paint генерируется явно с помощью унаследованного метода Invalidate(). Этот метод делает перерисовывание всей клиентской области программным путем.

Метод Invalidate() имеет несколько перегруженных вариантов. Например, если нужно обновить заданный прямоугольник, то нужно создать такой код:

8. Программирование обработчиков событий MouseDown, MouseMove и MouseUp.

Для осуществления поворота графика с помощью мышки нужно запрограммировать соответствующие обработчики событий.

Если нажать клавишу мыши и удерживать ее нажатой над формой Form2, а потом отпустить, то генерируются такие события (рисунок 4):

  • MouseDown – генерируется, если пользователь делает клик мышкой на форме Form2;
  • MouseMove – генерируется, если пользователь перемещает мышку над формой Form2 (независимо, нажата ли одна из кнопок мышки);
  • MouseUp – генерируется, если пользователь отпускает кнопку мышки после нажатия.

9. Листинг модуля « Form2.cs ».

Ниже приведен полный текст файла ” Form2.cs ”, который соответствует форме Form2.

10. Программирование события клика на кнопке button1 формы Form1 (вызов формы рисования графика функции).

При клике на кнопке button1 из формы Form1 может выводиться график функции.

Обработчик события клика на кнопке Button1 имеет вид.

11. Запуск программы.

После запуска программы на выполнение, форма графика функции изображена на рисунке 5.

прежде чем рисовать линии и фигуры, отображать текст или отображать изображения с помощью GDI+, необходимо создать Graphics объект. Graphicsобъект представляет GDI+ поверхность рисования, а — объект, используемый для создания графических изображений.

Работа с графикой состоит из двух этапов.

Использование Graphics объекта для рисования линий и фигур, отображения текста или отображения изображений и управления ими.

Создание графического объекта

Графический объект может быть создан различными способами.

Создание графического объекта

Получение ссылки на графический объект в составе PaintEventArgs Paint события формы или элемента управления. Обычно это способ получения ссылки на графический объект при создании кода рисования для элемента управления. Аналогично, объект Graphics можно также получить как свойство объекта PrintPageEventArgs при обработке PrintPage события для PrintDocument .

Вызовите CreateGraphics метод элемента управления или формы, чтобы получить ссылку на Graphics объект, представляющий поверхность рисования этого элемента управления или формы. Используйте этот метод, если требуется рисовать на форме или элементе управления, который уже существует.

Создайте Graphics объект из любого объекта, наследующего от Image . Этот подход удобен, если требуется изменить уже существующий образ.

Следующие разделы содержат сведения о каждом из этих процессов.

PaintEventArgs в обработчике событий Paint

При программировании PaintEventHandler для элементов управления или PrintPage для PrintDocument объект Graphics предоставляется как одно из свойств PaintEventArgs или PrintPageEventArgs .

получение ссылки на объект Graphics из PaintEventArgs в событии Paint

Назначьте переменную для ссылки на Graphics объект, передаваемый как часть PaintEventArgs .

Вставка кода для заполнения формы или элемента управления.

В следующем примере показано, как ссылаться на Graphics объект из PaintEventArgs в Paint событии.

Метод CreateGraphics

Можно также использовать CreateGraphics метод элемента управления или формы для получения ссылки на Graphics объект, представляющий поверхность рисования этого элемента управления или формы.

Создание графического объекта с помощью метода CreateGraphics

Вызовите CreateGraphics метод формы или элемента управления, для которого требуется отобразить графические объекты.

Создание из объекта Image

Кроме того, можно создать графический объект из любого объекта, производного от Image класса.

Создание графического объекта из изображения

Вызовите Graphics.FromImage метод, указав имя переменной изображения, из которой нужно создать Graphics объект.

В следующем примере показано, как использовать Bitmap объект:

Объекты можно создавать только Graphics из неиндексированных .bmp файлов, таких как 16-разрядные, 24-разрядные и 32-разрядные .bmp файлы. Каждый пиксель неиндексированных .bmp файлов содержит цвет, в отличие от точек индексированных .bmp файлов, которые содержат индекс для таблицы цветов.

Рисование фигур и изображений и управление ими

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

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

BrushКласс, используемый для заливки областей графических объектов, таких как заполненные фигуры, изображения или текст.

FontКласс — содержит описание фигур, используемых при отрисовке текста.

ColorСтруктура — представляет различные отображаемые цвета.

Использование созданного объекта Graphics

Для рисования нужного объекта выполните действия с соответствующим объектом, приведенным выше.

БлогNot. Visual C++: рисуем мышью на форме

Visual C++: рисуем мышью на форме

Предыдущая заметка по теме была вот здесь, а дальше легко найти по цепочке :) Тем не менее, простого примера на рисование мышкой "как в Paint" что-то не видно, попробуем сделать его прямо сейчас.

1. Рисовать будем непосредственно на канве формы, хотя вообще-то лучше на PictureBox , растянутом на всю форму. Тогда просто получите MyGraphics от этого PictureBox . В классе формы приложения Windows Forms пропишем нужные данные:

На событие загрузки формы (Load) проинициализируем данные:

По событию MouseDown формы (нажатие кнопки мыши) будем разрешать рисование:

а по событию MouseUp (отпускание кнопки мыши) - запрещать:

По событию. "движение мыши" формы (MouseMove) будем рисовать, если включён флажок isPaint и текущие координаты мыши отличаются от последних координат, сохранённых в переменной p . Также запомним новые координаты:

Вместо точки мы здесь выводим эллипс 2x2 пиксела. Работать с массивами отдельных пикселов можно, например, через System::Windows::Media::Imaging::WriteableBitmap.

Очищать рисунок можно по любому удобному событию или выбору кнопки (пункта меню). Используем для этого двойной щелчок (MouseDoubleClick) по форме:

2. Увы, при быстром движении мыши обработчик события MouseMove не будет успевать рисовать маленькие эллипсы и линия получится разрывной. Проще всего решить проблему, соединяя текущую точку p и точку, полученную из текущего положения мыши, линией.

Вот как изменится весь написанный нами код:

3. Наконец, существует удобный способ рисования, связанный с классом System::Drawing::Drawing2D::GraphicsPath.

Ниже прилагается полный листинг для вставки в приложение Windows Forms. Его внимательный анализ поможет вам освоить и этот способ. Кроме того, здесь MouseDown различает кнопки мыши, MouseUp определяет число кликов, а MouseMove можно заставить рисовать "непрерывно", раскомментарив одну строчку.

Рисование простых линий на форме или элементах управления и печать этих линий

Листинг 5.1. Код для рисования прямой линии.

private void Form1_Paint(object sender, PaintEventArgs e)

//Задаем цвет и толщину пера:

Pen myPen = new Pen(Color.Black, 3);

e.Graphics.DrawLine(myPen, 10, 15, 100, 120);

//Высвобождаем память, выделенную объекту myPen:

Листинг 5.2. Код для рисования кривых линий.

private void Form1_Paint(object sender, PaintEventArgs e)

//Задаем цвет и толщину пера:

Pen myPen = new Pen(Color.Black, 3);

//Рисуем эллипс лица:

e.Graphics.DrawEllipse(myPen, 0, 0, 200, 220);

//Рисуем закрытый глаз как дугу:

e.Graphics.DrawArc(myPen, 35, 35, 35, 35, 180, -180);

//Рисуем открытый глаз как эллипс:

e.Graphics.DrawEllipse(myPen, 120, 35, 35, 35);

//Рисуем нос как линию (сплайн) Безье:

e.Graphics.DrawBezier(myPen, 100, 60, 120, 100,

//Рисуем рот как канонический сплайн:

Point[] apt = new Point[4];

apt[0] = new Point(60, 140);

apt[1] = new Point(140, 140);

apt[2] = new Point(100, 180);

apt[3] = new Point(60, 140);

e.Graphics.DrawCurve(myPen, apt, 0, 3, 0.9f);

//Высвобождаем память, выделенную объекту myPen:

private void button1_Click(object sender, EventArgs e)

//Передаем объекту printDialog1 информацию об объекте

//printDocument1 при помощи свойства Document:

//Выводим стандартную панель Print при помощи метода

//ShowDialog() для задания параметров печати

//и после щелчка OK на панели Print печатаем документ

//при помощи метода Print():

if (printDialog1.ShowDialog() == DialogResult.OK)

Листинг 5.4. Код на Visual Basic для печати изображения на принтере.

Private Sub Button3_Click(ByVal sender As System.Object, _

ByVal e As EventArgs) Handles Button3.Click

'Передаем объекту PrintDialog1 информацию об объекте

'PrintDocument1 при помощи свойства Document:

'Выводим панель Print при помощи функции ShowDialog

'для задания параметров и вызываем процедуру Print():

If PrintDialog1.ShowDialog() = DialogResult.OK Then

Листинг 5.5. Код на прежнем Visual C++ (2002-2004 годов) для печати.

System::Void button3_Click(System::Object * sender,

//Передаем объекту printDialog1 информацию об объекте

//printDocument1 при помощи свойства Document:

//Выводим стандартную панель Print при помощи метода

//ShowDialog() для задания параметров печати

//и печатаем документ после щелчка OK на панели Print

//при помощи метода Print():

if (printDialog1->ShowDialog() == DialogResult::OK)

Листинг 5.6. Код на новом Visual C++ 2005 для печати изображения.

System::Void button3_Click(System::Object^ sender,

//Передаем объекту printDialog1 информацию об объекте

//printDocument1 при помощи свойства Document:

//Выводим стандартную панель Print при помощи метода

//ShowDialog() для задания параметров печати

//и печатаем документ при помощи метода Print():

Если мы не желаем видеть перед печатью стандартную панель Print, то компонент PrintDialog нам не потребуется, а в шаблон обработчика щелчка по кнопке вместо кода на листинге 5.3 записываем только одну строку кода:

Проверяем в действии созданную нами программу для печати на принтере любых изображений. Для этого получаем на экране монитора (по описанной выше методике) заданное изображение и щелкаем кнопку Print.

Появляется стандартная панель Print (рис. 5.5), на которой мы выбираем (или оставляем по умолчанию) принтер и задаем параметры печати. Например, можно изменить ориентацию печати и вместо Portrait (Портрет) выбрать переключатель Landscape (Ландшафт). После щелчка кнопки Печать (Print) или OK принтер печатает только одно изображение без формы и элементов управления.

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