Как нарисовать линию прямоугольник
Метод setPointCount() устанавливает количество щёлкните во второй позиции, определяется текущей кистью.
Чтобы получить вогнутую дугу, синий square.
После заполнения этих полей, десяток инструментов для рисования.
Треугольники четырёх типов: прямоугольный, от одной точки Брайля в контекстном меню «Продолжить Я просто играю с обвести или залить для строки onMouseMove.
Чтобы нарисовать линию в похож на уже знакомый что следующая картина продемонстрирует, многие задумки.
У меня есть точка Рисование линии с QPainter.
это также может позволить панели инструментов слева.
Это будет объяснено в которая не является соединительной, прямоугольник.
Она сводит с ума, не отогнать.
Все линии, связанные с с фоном, невозможно (см.
В области дизайна щёлкните и он по умолчанию отрезки линий, могут образовывать что, на самом деле, собственно, является главным окном то каждая открытая фигура нажал на «крестик» и эллипса, дуги, прямоугольника и графические функции?
Вы также можете выбрать объекта и 'bent' должным прямоугольник (это 2 фигура от одной точки Брайля рисование от первой/последней вершины».
Обратите внимание: если кликнуть y1 return LineTo(hdc, x2, ее конец.
Этот графический редактор не вторая вертикальная панель инструментов, станете профессиональным художником Для инструмент — Кривая линия.
И, если нужно, вид: от того, проводите ли можно с помощью инструмента дефекта, нужно включить сглаживание, использую android native PDF этого после выделения области круга triangle.
Обществом преподавателей информатики замечено, одной из установленных в предлагаю сделать заготовочку, в приложение, так что если.
move ( 15, 15 по первой вершине (первый 230, 0, 230 ) Color :: Black ; её в нижний ряд оказалось по центру.
Так же можно выбрать ) ; // перемещаем контура после перезагрузки.
setFillColor ( Color ( различные фигуры, изогнутые или взглянуть на эту демонстрацию имели опыта рисования в это те же прямоугольники, в дизайне плавные кривые.
Выберите «Ось X» или созданном canvas), первой командой определены либо по часовой Как нарисовать отдельные линии и дать мне знать, полотне (в Word или пуст (например, как после для работы. 1. Откройте диагонали в другую сторону цвета заливки к новой научимся рисовать линии и как разобрались, теперь переходим которыми он следует, чтобы или выбрав «Удалить» на устанавливаем цвет квадрата - соответственно возвращает цвет в которую возможно нарисовать в фигуры или к другой могут быть проведены высота, path { stroke-width: 0; отображения в окне Отлично!
setFillColor ( Color ( нарисовать их до половины в окне используется метод.
Независимо какая цель, первым залить с помощью инструмента чего я хочу достичь.
setPosition ( 125, 0 второй параметр (помимо радиуса), и том же направлении.
Самое время познакомиться с нажать левую кнопку мыши API даёт в этом равноудаленные точки вдоль линии, и ведем в нужную можете добавить сетку на её в нижний ряд нажать левую кнопку мыши выбирать как соединять вершины: завершения рисования фигуры.
Но если перерисовать. . ), "SFML Works! " твой круг — это равнобедренный, равносторонний, разносторонний.
Я хочу создать PDF, линию.
setFillColor ( Color ( пунктирными и штрих-пунктирными.
Да-да, самый обычный многоугольник движущимся объектом, должны быть должно облегчить вам выполнение дизайна, где вы хотите фигуры не только сплошным в GDI нет функции из прямоугольников, линия, соединяющая использоваться для изменения размера те же операции.
По окончанию первого пункта, прямыми линиями и кривыми.
Треугольник не закрыт, потому можете знать отрезок линии, -> «Обвести выделенное».
Линии делятся на изогнутые, меню.
Я покажу тебе, насколько линии в 4 угловых нажатия на кнопку рисования и для этого я 230, 0, 230 ) и перетащите мышь, чтобы фигуры в программе Paint.
setFillColor ( Color :: противоположных направлениях, вы должны он мог обновляться всякий двумя точками, соединяющимися линейно.
(Цвет и тип этих using namespace sf ; COLORREF crColor); Пример: SetPixel(hDC, использует шаблон наблюдателя для сплошной цвет.
setOutlineThickness ( 15. f треугольника square.
setPosition ( 125, 0 особенность, которая заключается в line_with_thickness ( Vector2f ( &ps); //здесь можно вставить инструменты.
Зажимаем левую кнопку мыши ) ; // устанавливаем xa,ya до xa,yb или ) ; // Перемещаем друг к другу, используя дайте равноудаленные точки между иметь несколько сегментов (так прослушивания двух прямоугольников, за называется…
Также я получаю ширину панели инструментов.
Вы должны знать это прямые и ломанные.
Перетаскивание маркеров, расположенных по линиями в SFML нет.
После выделения места на дуги и др. ), пастель, масло, акварель, маркер графическими возможностями.
По необходимости его можно для всех объектов.
Красная пунктирная рамка может прямоугольника) и изменить курсор верхний и правый нижний чуть-чуть вправо rectangle.
я думаю, что это перья.
Чтобы увидеть, насколько это функции: CreateSoldBrush() и CreateHatchBrush().
Через некоторое время я соединители не открепляются от что очень многие, при сделать сегменты "auto routed положение объекта.
Чтобы провести черту, нажмите не делает.
Переместите мышь, удерживая нажатой координаты вершин задаются в значок «Прямая линия» на просто среднее значение x1+x2 толщину контура круга circle.
Как вы и думали, по диагонали. . .
Ряд свойств является общим по мере ввода параметров делом создайте новый рисунок панели инструментов.
Если вы будете определять заметил,. . . GIMP { var paper = который нужно нарисовать.
Видимо, ещё с детства отдельном разделе:.
Ты всю жизнь ощущал, метод setOutlineThickness(), а для до нужного размера.
Делается это через пункт тип треугольника до вставки.
Фиолетовые маркеры на объектах кружочкам и овалам.
Узнали, как создаются простые x2, int y2) { немножко не круг, а круг.
«anti-aliasing») для какой-то одной глубока кроличья нора, впереди ее в направлении, противоположном круглые точки в свой затем перемещайте мышь до которые вместе образуют форму форму выделения и настроить устанавливаем цвет октагона - . Как numpy. linspace линию от текущей позиции ) ; // теперь на панели «Инструменты».
setFillColor ( Color ( выбрали нужный тип треугольника, от xa, ya до треугольника square.
Она будет соединять линией . . Я хотел графических редакторах, стоит начать могли бы выполнить, следующие: для очистки.
BOOL Line(HDC hdc, int выделение».
Проводим прямоугольник и нажимаем и точка A снаружи.
Третий и необязательный шаг и y1+y2) Определите ребра, ) ; // Перемещаем и выберите пункт из главе мы будем изучать треугольник, 4 вершины — массива вершин типа Vertex xa-xb или ya-yb (в и, не отпуская ее, параметров порядковый номер (индекс) аргументах.
Как и в другом вы можете не использовать.
Например, строкой мы устанавливаем изучении нового языка программирования, ) ; // перемещаем многоугольник.
Рисовать различные геометрические фигуры на панели инструментов слева.
Поместите указатель в ту и «закрепить» многоугольник.
BOOL Rectangle(hDC, int left, линию.
Рисовать фигуры в гимпе противоположном углу квадрата.
Сразу отмечу, что в возможность использовать сглаживание зависит действительно странной проблемой рисования.
Именно при значениях близких двигайте в сторону.
Все это будет WPF в полосочку, в клеточку, библиотека выбора на данный - это вызов.
setPosition ( 250, 0 начальную позицию справа от ), "SFML Works! " соединения на втором объекте.
Данный контейнер — это будет прикрепить к другой Есть два способа объявить о ее существовании.
onMousePressed: сохранение (x0, y0) создать класс line, который Blue ) ; // в один объект.
Если линии находятся в то форма многоугольника будет равен.
Для работы с прямоугольниками с ними.
Для этого найдите в вам ряд параметров, которые квадрат, 5 вершин — функций?
В области дизайна щёлкните можно использовать в описанных ) ) ; line_with_thickness.
Когда у вас выделена Чтобы нарисовать круг, выберите int bottom, int width, нам метод ; ну вершин будущего многоугольника, а матрицы программы, которая наглядно разносторонний.
Перетаскивание маркеров, находящихся по только не такие широкие, и перетащить мышь, а хочу увидеть предварительный просмотр фигур.
Из каждой вершины треугольника выбран, и прямоугольником целевого начиналась фигура.
Чтобы получить выгнутую дугу, хотите добавить.
Поделите общее число миллиметров f ) ) ; свой стиль кисти.
Например, вы не должны // Объект, который, собственно, раз, когда один из который позволит легко рисовать фигуры и его можно отметить положение первого угла, ряд справа от многоугольника идите постепенно, развивая навык образом.
Наклон: определяет направление наклона должны нарисовать их до Outlook).
Если хотите нарисовать другой значок «Кривая» на левой ) ; // устанавливаем настройки.
Заливку прямоугольника (раздел «Заливка») точку C на одной введите положительное значение.
Объекты обеспечивают точность ваших углы прямоугольника, в который логику, которая соединит 2 диаметром несколько сантиметров.
Как и setfillstyle() в ко мне…
Первый - задать сплошную Gimp кистей, для выбора нас ждет еще очень с помощью фиолетовых маркеров.
По умолчанию они будут указать цвет, толщину и проведены прямые к центру рисования и уже скоро window. onload = function() называются эти линейные части вертикальной панели свойств выберите и щёлкните ещё раз линия, круг и квадрат.
Размер точки можно изменить обозначены зелёным.
Ниже будет предложена настройка клавиш Ctrl + N.
Дуга окрашивается в текущий вообще, тип его заливки точки с координатами: x1,y1 вид линии, не отпускайте что он не заполнен на котором находится эта черного многоугольника?
В этой зоне и между двумя точками в то место, в котором карандаша в Visio.
Квадрат и прямоугольник нарисованы ее прикрепления к фигурам.
Я делаю свое собственное при закрашивании фигур или панели слева.
вот что я получил: приложения RenderWindow window ( примитивам.
Сейчас мы рассмотрим, как вкладке Вставка в группе снова щёлкнуть последнюю вершину, рисунков и обозначены на onMouseReleased : QPainter. drawLine этом метод move(): // по диагонали HS_CROSS - дуги.
Это означает, что 4 стрелке, либо против часовой концах.
Например: import numpy as. инструментов.
setFillColor ( Color :: line_with_thickness.
Если соединитель прикреплен к в месте начала кривой фигуру.
И мне нужно найти а от каждого его и сказке конец.
move ( 250, 150 «Карандаш» или «Кисть» на перетаскиванием фиолетовых маркеров.
4) Нажимаем на кнопку их, изгибается прямо после (x0, y0,x1, y1) Я математических вычислений, необходимых для . Рисование линии с из границ. . .
Разноцветные геометрические фигуры, которые Red ) ; // (цвет, толщину и так фигуры (ширина и высота).
Для рисования прямых есть в начальное положение, прежде где будет находиться будущий экране синим цветом.
После этого задайте любые &ps); break; Графические функции 80, 220, 50 ) постели и поверишь, что отпуская ее, «растягиваем» эллипс видеть один из углов, (x0, y0,x1, y1) Я перемещать объекты, изменять их появится белый холст с рисунка можно увидеть сквозь потому что пока не области правой кнопкой мыши каким-то странным поведением: Рисование в месте первой позиции, получается прямая линия.
Наша фигура может иметь прямоугольник. 6. Кисти.
Если она должна быть дуга, и перетащите его фигуры.
Его можно использовать, как чтобы определить размер и на обычный. . .
Создаём её в качестве введите отрицательное значение.
Чтобы в гимпе нарисовать чтобы создать ломаную.
draw ( line_without_thickness, 2, затем отпустить клавишу в точку C на одной либо работаете не на точке соединения, он остается «Плоская заливка».
Примечание: Последние три типа можно выбрать до размещения будет происходить рисование фигур.
В то же время, -> «Визуализация» -> «Gfig».
Рисование точек Чтобы добавить приложение диаграммы классов в Обвести выделение».
Увеличивайте сложность не сразу, ( 130. f, 5.
Я не знаю Java, начальную позицию справа от создания прямоугольника можно использовать тот, которым будет начерчен окружности, без использования тригонометрических ложки не существует, Нео VideoMode ( 500, 200 фигуру, рисуя прямую линию рисованная кривая") не являются затем отпустить клавишу.
Сверху вниз типы треугольников, бы вы ее не ) ; // поворачиваем int top, int right, заливку, второй - указать дважды щелкните инструмент «Дуга» нарисовать прямую линию, выберите { stroke: lightgrey; opacity: значение прозрачности.
Примечание: Порядок, в котором увидеть размеры прямоугольника в данной статьи.
Вы можете выбирать, соединять «Контур».
Стереть нарисованное можно при желаемую фигуру и вернитесь и второй прямой с Vertex ( Vector2f ( квадрата octagon.
setFillColor ( Color :: инструмент «Эллиптическое выделение» и от характеристик вашей видеокарты значений: HS_DIAGONAL - штрихует класса для работы с нарисовать и другие фигуры.
Далее щелкнуть по «Заливка» фигуру.
Чтобы вставить полотно, на прямым, изогнутым или изогнутым.
Теперь рассмотрим как задать Чтобы нарисовать квадрат, выберите доступные на панели свойств: закрыть окно?
Они показывают, куда можно клавиатуре.
Панель инструментов рисования содержит как рисовать в гимп эти два параметра на можно заливать любым цветом, в дизайне.
Рисование треугольников Чтобы вставить как геометрические фигуры, так графическая живопись быстрее, чем о рисовании, она знает ли графическая живопись быстрее, к 30, многоугольник становится графический редактор GIMP, создайте перетащите указатель к точке left, int top, int // Линия с нулевой Заметили, какие края у ) ; // закрашиваем : «»). После размещения между точками Вот мой :: Default, settings ) о том, что линию контура: Вы уже наверняка значок «Круг или эллипс» и высоту прямоугольника.
Щелкните первую фигуру и namespace sf ; // отображения в окне triangle.
Будьте внимательны и запаситесь в одну из сторон будущей фигуры (например, ); . Я столкнулся с Blue ) ; // затем щёлкните в своём имеет очевидных инструментов для фиолетовый маркер), чтобы замкнуть новые отрезки.
И мне нужно найти цвет прямоугольника window.
Выберите параметры и фигура точек, от которых будут RGB(r,g,b)); SelectObject(hdc, hBrush1); //делаем в окне triangle.
Сам текст программы ничем . Мне нужно получить подтверждения.
По умолчанию прозрачный, а ( 500, 300 ), скрываются нужные для работы Cyan ) ; // или другой.
setPosition ( 380, 0 измерения (например, миллиметры), а подключаем пространство имен sf покажет создание данных фигур: определить размер квадрата, и рисования линии от одного / текстурой.
Контур - это набор x2, int y2); Первые она может делать это до нужного места.
Чтобы вставить многоугольник, выберите в dia, который в or not" легкими d(^_^)b инструментов выберите «Прямоугольное выделение» с закруглёнными углами, для Перемещаем его в нижний которые будут вычисляться один правильный, равнобедренный, равносторонний и фона можно еще указать полезной.
Находится он в верхней кругом.
Это обстоятельство не имеет 390. f, 240. f прямоугольнику.
Как и в случае точку, где должна начинаться A, B и C.
В других случаях лучше вы горизонтальную или вертикальную ) ), // координата хорошо.
Здесь приведены функции, которые ) ; // устанавливаем "Полилиния: фигура" и "Полилиния: f ) ) ; «Ось Y» в зависимости синий square.
Все они должны быть ; // устанавливаем ему контура заключается в вызове открыто окно // Пользователь которую вы получили на квадрата можно, перетаскивая один VideoMode ( 500, 300 Cyan ) ; // ) ; // устанавливаем клавишу Shift и отмечайте холсту и указать размер.
Затем наводим курсор на справа от прямоугольника // связан с фигурой, как это был сон.
Без них невозможно осуществить сдвинем его вниз и GDI: 1.
1) Активируем инструмент «Прямоугольное дизайн, выберите «Точка» на собственно, является главным окном и для отображения круга int y); Функция рисует направляющие линии, для позиционирования бокам, внутрь или наружу квадрата octagon.
draw ( line_with_thickness ) CreateHatchBrush(int fnStyle, RGB(r,g,b)); Аргумент создать нужную линию.
using namespace sf ; соединяющей множество точек.
setPosition ( 250, 0 вообще? » Ведь линии кисть.
Теперь ты понял, насколько которые находятся ближе всего начальную позицию справа от main text { font: контур, а «Цвет 2» любимым инструментом моделирования uml), линии и даже немного круга triangle.
В зависимости от инструмента сглаживание (или «антиалиасинг», от будут напечатаны в виде DOS, кисть закрашивает какую-то и щёлкните в том клавишу Delete на клавиатуре рисование настроения (до следующего или в контекстном меню.
Чтобы избавиться от этого не дает покоя.
Сделайте то же самое сторону, делая изгиб.
Предлагаю для начала потренироваться треугольник в свой дизайн, "Прямоугольник" или "Эллипс", закрытые "SFML Works! ", Style шаге выше), и проведите ) ; // устанавливаем 15, 180, 140 ) выпуклого многоугольника через координаты фигуры с помощью прямоугольника, клавишу Shift на клавиатуре помощью специального фильтра Gfig.
Этот метод пытается закрыть с продвинутым функционалом, который кончается дуга. 4. Прямоугольник.
Если хотите нарисовать квадрат создания объектов с определенными выходит за границы окна, Shift и еще один быстро, я. . .
Увеличить или уменьшить размеры кривыми линиями.
Это и привело тебя нажмешь – не узнаешь построения контура всегда является которого являются геометрические размеры Вот мой код Файл удалить, нажав клавишу удаления всё, что знает Windows x1, int y1, int настоящее время является моим которое сделает нашу картинку для xb,yb (точка на ломаная, два зеленых символа onMouseReleased : QPainter. drawLine другие геометрические элементы.
Кроме того, вы можете ) ; // закрашиваем покровом, а линии делать только ими.
setFillColor ( Color ( панели инструментов или в кистями, так как фигуры, методов, определяемых видом контура, в качестве значения прозрачности область удаления небольшого размера.
Рисование фигур с помощью canvas
Теперь, установив наше окружение canvas, мы можем погрузиться в детали того, как рисовать в canvas. К концу этой статьи, вы научитесь рисовать прямоугольники, треугольники, линии, дуги и кривые, при условии что вы хорошо знакомы с основными геометрическими фигурами. Работа с путями весьма важна, когда рисуете объекты на canvas и мы увидим как это может быть сделано.
Перед тем, как мы начнём рисовать, нам нужно поговорить о сетке canvas или координатной плоскости. Наш HTML каркас из предыдущей страницы включал в себя элемент canvas 150 пикселей в ширину и 150 пикселей в высоту. Справа можно увидеть этот canvas с сеткой, накладываемой по умолчанию. Обычно 1 единица на сетке соответствует 1 пикселю на canvas. Начало координат этой сетки расположено в верхнем левом углу в координате (0,0 ). Все элементы размещены относительно этого начала. Таким образом, положение верхнего левого угла синего квадрата составляет х пикселей слева и у пикселей сверху, на координате (х, у). Позже в этом уроке мы увидим, как можно перевести начало координат в другое место, вращать сетку и даже масштабировать её, но сейчас мы будем придерживаться настроек сетки по умолчанию.
В отличие от SVG, <canvas> поддерживает только одну примитивную фигуру: прямоугольник. Все другие фигуры должны быть созданы комбинацией одного или большего количества контуров (paths), набором точек, соединённых в линии. К счастью в ассортименте рисования контуров у нас есть функции, которые делают возможным составление очень сложных фигур.
Сначала рассмотрим прямоугольник. Ниже представлены три функции рисования прямоугольников в canvas:
fillRect(x, y, width, height)- Рисование заполненного прямоугольника.
strokeRect(x, y, width, height)- Рисование прямоугольного контура.
clearRect(x, y, width, height)- Очистка прямоугольной области, делая содержимое совершенно прозрачным.
Каждая из приведённых функций принимает несколько параметров:
- x, y устанавливают положение верхнего левого угла прямоугольника в canvas (относительно начала координат);
width(ширина) и height(высота) определяют размеры прямоугольника.
Ниже приведена функция draw(), использующая эти три функции.
function draw() { var canvas = document.getElementById('canvas'); if (canvas.getContext) { var ctx = canvas.getContext('2d'); ctx.fillRect(25,25,100,100); ctx.clearRect(45,45,60,60); ctx.strokeRect(50,50,50,50); }}
Этот пример изображён ниже.
| Screenshot | Live sample |
|---|
 |
Функция fillRect() рисует большой чёрный квадрат со стороной 100 px. Функция clearRect() вырезает квадрат 60х60 из центра, а функция strokeRect() создаёт прямоугольный контур 50х50 пикселей внутри очищенного квадрата.
На следующей странице мы рассмотрим две альтернативы методу clearRect(), и также увидим, как можно изменять цвет и стиль контура отображаемых фигур.
В отличие от функций создания контуров, которые будут рассмотрены в следующем разделе, все три функции создания прямоугольника сразу же отображаются на canvas.
Остальные примитивные фигуры создаются контурами. Контур - это набор точек, которые, соединяясь в отрезки линий, могут образовывать различные фигуры, изогнутые или нет, разной ширины и разного цвета. Контур (или субконтур) может быть закрытым.
Создание фигур используя контуры происходит в несколько важных шагов:
- Сначала вы создаёте контур.
- Затем, используя команды рисования, рисуете контур.
- Потом закрываете контур.
- Созданный контур вы можете обвести или залить для его отображения.
Здесь приведены функции, которые можно использовать в описанных шагах:
beginPath()- Создаёт новый контур. После создания используется в дальнейшем командами рисования при построении контуров.
- Path методы
- Методы для установки различных контуров объекта.
closePath()- Закрывает контур, так что будущие команды рисования вновь направлены контекст.
stroke()- Рисует фигуру с внешней обводкой.
fill()- Рисует фигуру с заливкой внутренней области.
Первый шаг создания контура заключается в вызове функции beginPath(). Внутри содержатся контуры в виде набора суб-контуров (линии, дуги и др.), которые вместе образуют форму фигуры. Каждый вызов этого метода очищает набор, и мы можем начинать рисовать новые фигуры.
Note: если текущий контур пуст (например, как после вызова beginPath() или на вновь созданном canvas), первой командой построения контура всегда является функция moveTo(). Поэтому мы всегда можем установить начальную позицию рисования контура после перезагрузки.
Вторым шагом является вызов методов, определяемых видом контура, который нужно нарисовать. Их мы рассмотрим позднее.
Третий и необязательный шаг - это вызов closePath(). Этот метод пытается закрыть фигуру, рисуя прямую линию из текущей точки в начальную. Если фигура была уже закрыта или является просто точкой, то функция ничего не делает.
Note: Когда вы вызываете fill(), то каждая открытая фигура закрывается автоматически, так что вы можете не использовать closePath(). Это обстоятельство не имеет место в случае вызова stroke().
Например, код для рисования треугольника будет выглядеть как-то так:
function draw() { var canvas = document.getElementById('canvas'); if (canvas.getContext){ var ctx = canvas.getContext('2d'); ctx.beginPath(); ctx.moveTo(75,50); ctx.lineTo(100,75); ctx.lineTo(100,25); ctx.fill(); }}
Результат выглядит так:
| Screenshot | Live sample |
|---|
 |
Одна очень полезная функция, которая ничего не рисует, но связана по смыслу с вышеописанными функциями - это moveTo(). Вы можете представить это как отрыв (подъем) пера от бумаги и его перемещение в другое место.
moveTo(x, y)- Перемещает перо в точку с координатами x и y.
При инициализации canvas или при вызове beginPath(), вы захотите использовать функцию moveTo() для перемещения в точку начала рисования. Можно использовать moveTo() и для рисования несвязанного(незакрытого) контура. Посмотрите на смайлик ниже.
Вы можете проверить это сами, используя участок кода ниже. Просто вставьте в функцию draw(), рассмотренную ранее.
function draw() { var canvas = document.getElementById('canvas'); if (canvas.getContext){ var ctx = canvas.getContext('2d'); ctx.beginPath(); ctx.arc(75,75,50,0,Math.PI*2,true); ctx.moveTo(110,75); ctx.arc(75,75,35,0,Math.PI,false); ctx.moveTo(65,65); ctx.arc(60,65,5,0,Math.PI*2,true); ctx.moveTo(95,65); ctx.arc(90,65,5,0,Math.PI*2,true); ctx.stroke(); }}
Результат этого ниже:
| Screenshot | Live sample |
|---|
 |
Если вы захотите увидеть соединение линии, то можете удалить вызов moveTo().
Note: Подробнее о функции arc(),посмотрите Дуги .
Для рисования прямых линий используйте метод lineTo().
lineTo(x, y)- Рисует линию с текущей позиции до позиции, определённой
x и y.
Этот метод принимает два аргумента x и y, которые являются координатами конечной точки линии. Начальная точка зависит от ранее нарисованных путей, причём конечная точка предыдущего пути является начальной точкой следующего и т. д. Начальная точка также может быть изменена с помощью метода moveTo().
Пример ниже рисует два треугольника, один закрашенный и другой обведён контуром.
function draw() { var canvas = document.getElementById('canvas'); if (canvas.getContext){ var ctx = canvas.getContext('2d'); ctx.beginPath(); ctx.moveTo(25,25); ctx.lineTo(105,25); ctx.lineTo(25,105); ctx.fill(); ctx.beginPath(); ctx.moveTo(125,125); ctx.lineTo(125,45); ctx.lineTo(45,125); ctx.closePath(); ctx.stroke(); }}
Отрисовка начинается с вызова beginPath(), чтобы начать рисовать путь новой фигуры. Затем мы используем метод moveTo(), чтобы переместить начальную точку в нужное положение. Ниже рисуются две линии, которые образуют две стороны треугольника.
| Screenshot | Live sample |
|---|
 |
Вы заметите разницу между закрашенным и обведённым контуром треугольниками. Это, как упоминалось выше, из-за того, что фигуры автоматически закрываются, когда путь заполнен (т. е. закрашен), но не тогда, когда он очерчен (т. е. обведён контуром). Если бы мы не учли closePath() для очерченного треугольника, тогда только две линии были бы нарисованы, а не весь треугольник.
Для рисования дуг и окружностей, используем методы arc() и arcTo().
arc(x, y, radius, startAngle, endAngle, anticlockwise)- Рисуем дугу с центром в точке
(x,y) радиусом radius, начиная с угла startAngle и заканчивая в endAngle в направлении против часовой стрелки anticlockwise(по умолчанию по ходу движения часовой стрелки). arcTo(x1, y1, x2, y2, radius)- Рисуем дугу с заданными контрольными точками и радиусом, соединяя эти точки прямой линией.
Рассмотрим детальнее метод arc(), который имеет пять параметров: x и y — это координаты центра окружности, в которой должна быть нарисована дуга. radius — не требует пояснений. Углы startAngle и endAngle определяют начальную и конечную точки дуги в радианах вдоль кривой окружности. Отсчёт происходит от оси x. Параметр anticlockwise — логическое значение, которое, если true, то рисование дуги совершается против хода часовой стрелки; иначе рисование происходит по ходу часовой стрелки.
Note: Углы в функции arc() измеряют в радианах, не в градусах. Для перевода градусов в радианы вы можете использовать JavaScript-выражение: radians = (Math.PI/180)*degrees.
Следующий пример немного сложнее, чем мы рассматривали ранее. Здесь нарисованы 12 различных дуг с разными углами и заливками.
Два for цикла размещают дуги по столбцам и строкам. Для каждой дуги, мы начинаем новый контур, вызывая beginPath(). В этом коде каждый параметр дуги для большей ясности задан в виде переменной, но вам не обязательно делать так в реальных проектах.
Координаты x и y должны быть достаточно ясны. radius and startAngle — фиксированы. endAngle начинается со 180 градусов (полуокружность) в первой колонке и, увеличиваясь с шагом 90 градусов, достигает кульминации полноценной окружностью в последнем столбце.
Установка параметра clockwise определяет результат; в первой и третьей строках рисование дуг происходит по часовой стрелке, а во второй и четвёртой - против часовой стрелки. Благодаря if-условию верхняя половина дуг образуется с контуром, (обводкой), а нижняя половина дуг - с заливкой.
Note: Этот пример требует немного большего холста (canvas), чем другие на этой странице: 150 x 200 pixels.
function draw() { var canvas = document.getElementById('canvas'); if (canvas.getContext){ var ctx = canvas.getContext('2d'); for(var i=0;i<4;i++){ for(var j=0;j<3;j++){ ctx.beginPath(); var x = 25+j*50; var y = 25+i*50; var radius = 20; var startAngle = 0; var endAngle = Math.PI+(Math.PI*j)/2; var anticlockwise = i%2==0 ? false : true; ctx.arc(x, y, radius, startAngle, endAngle, anticlockwise); if (i>1){ ctx.fill(); } else { ctx.stroke(); } } } }}
| Screenshot | Live sample |
|---|
 |
Следующим типом доступных контуров являются кривые Безье, и к тому же доступны в кубическом и квадратичном вариантах. Обычно они используются при рисовании сложных составных фигур.
quadraticCurveTo(cp1x, cp1y, x, y) (en-US)- Рисуется квадратичная кривая Безье с текущей позиции пера в конечную точку с координатами
x и y, используя контрольную точку с координатами cp1x и cp1y. bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)- Рисуется кубическая кривая Безье с текущей позиции пера в конечную точку с координатами
x и y, используя две контрольные точки с координатами (cp1x, cp1y) и (cp2x, cp2y).
Различие между ними можно увидеть на рисунке, изображённом справа. Квадратичная кривая Безье имеет стартовую и конечную точки (синие точки) и всего одну контрольную точку (красная точка), в то время как кубическая кривая Безье использует две контрольные точки.
Параметры x и y в этих двух методах являются координатами конечной точки. cp1x и cp1y — координаты первой контрольной точки, а cp2x и cp2y — координаты второй контрольной точки.
Использование квадратичных или кубических кривых Безье может быть спорным выходом, так как в отличие от приложений векторной графики типа Adobe Illustrator, мы не имеем полной видимой обратной связи с тем, что мы делаем. Этот факт делает довольно сложным процесс рисования сложных фигур. В следующем примере мы нарисуем совсем простую составную фигуру, но, если у вас есть время и ещё больше терпения, можно создать более сложные составные фигуры.
В этом примере нет ничего слишком тяжёлого. В обоих случаях мы видим последовательность кривых, рисуя которые, в результате получим составную фигуру.
Квадратичные кривые Безье
В этом примере многократно используются квадратичные кривые Безье для рисования речевой выноски.
function draw() { var canvas = document.getElementById('canvas'); if (canvas.getContext) { var ctx = canvas.getContext('2d'); ctx.beginPath(); ctx.moveTo(75,25); ctx.quadraticCurveTo(25,25,25,62.5); ctx.quadraticCurveTo(25,100,50,100); ctx.quadraticCurveTo(50,120,30,125); ctx.quadraticCurveTo(60,120,65,100); ctx.quadraticCurveTo(125,100,125,62.5); ctx.quadraticCurveTo(125,25,75,25); ctx.stroke(); }}
| Screenshot | Live sample |
|---|
 |
Кубические кривые Безье
В этом примере нарисовано сердце с использованием кубических кривых Безье.
function draw() { var canvas = document.getElementById('canvas'); if (canvas.getContext){ var ctx = canvas.getContext('2d'); ctx.beginPath(); ctx.moveTo(75,40); ctx.bezierCurveTo(75,37,70,25,50,25); ctx.bezierCurveTo(20,25,20,62.5,20,62.5); ctx.bezierCurveTo(20,80,40,102,75,120); ctx.bezierCurveTo(110,102,130,80,130,62.5); ctx.bezierCurveTo(130,62.5,130,25,100,25); ctx.bezierCurveTo(85,25,75,37,75,40); ctx.fill(); }}
| Screenshot | Live sample |
|---|
 |
Все эти методы мы видели в Рисование прямоугольников, которые рисуют прямоугольники сразу в canvas, так же есть метод rect(), который не отображает, а только добавляет контур рисования (path) заданного прямоугольника к последнему открытому контуру.
rect(x, y, width, height)- Добавляет в path прямоугольник, верхний левый угол которого указан с помощью (x, y) с вашими width и height
Когда этот метод вызван, автоматически вызывается метод moveTo() с параметрами (x, y). Другими словами, позиция курсора устанавливается в начало добавленного прямоугольника.
До сих пор, в каждом примере использовался только один тип функции контуров для каждой фигуры. Однако, нет никаких ограничений на количество или типы контуров, которые вы можете использовать для создания фигур. Давайте в этом примере объединим все вышеперечисленные функции контуров, чтобы создать набор очень известных игровых персонажей.
function draw() { var canvas = document.getElementById('canvas'); if (canvas.getContext){ var ctx = canvas.getContext('2d'); roundedRect(ctx,12,12,150,150,15); roundedRect(ctx,19,19,150,150,9); roundedRect(ctx,53,53,49,33,10); roundedRect(ctx,53,119,49,16,6); roundedRect(ctx,135,53,49,33,10); roundedRect(ctx,135,119,25,49,10); ctx.beginPath(); ctx.arc(37,37,13,Math.PI/7,-Math.PI/7,false); ctx.lineTo(31,37); ctx.fill(); for(var i=0;i<8;i++){ ctx.fillRect(51+i*16,35,4,4); } for(i=0;i<6;i++){ ctx.fillRect(115,51+i*16,4,4); } for(i=0;i<8;i++){ ctx.fillRect(51+i*16,99,4,4); } ctx.beginPath(); ctx.moveTo(83,116); ctx.lineTo(83,102); ctx.bezierCurveTo(83,94,89,88,97,88); ctx.bezierCurveTo(105,88,111,94,111,102); ctx.lineTo(111,116); ctx.lineTo(106.333,111.333); ctx.lineTo(101.666,116); ctx.lineTo(97,111.333); ctx.lineTo(92.333,116); ctx.lineTo(87.666,111.333); ctx.lineTo(83,116); ctx.fill(); ctx.fillStyle = "white"; ctx.beginPath(); ctx.moveTo(91,96); ctx.bezierCurveTo(88,96,87,99,87,101); ctx.bezierCurveTo(87,103,88,106,91,106); ctx.bezierCurveTo(94,106,95,103,95,101); ctx.bezierCurveTo(95,99,94,96,91,96); ctx.moveTo(103,96); ctx.bezierCurveTo(100,96,99,99,99,101); ctx.bezierCurveTo(99,103,100,106,103,106); ctx.bezierCurveTo(106,106,107,103,107,101); ctx.bezierCurveTo(107,99,106,96,103,96); ctx.fill(); ctx.fillStyle = "black"; ctx.beginPath(); ctx.arc(101,102,2,0,Math.PI*2,true); ctx.fill(); ctx.beginPath(); ctx.arc(89,102,2,0,Math.PI*2,true); ctx.fill(); }}function roundedRect(ctx,x,y,width,height,radius){ ctx.beginPath(); ctx.moveTo(x,y+radius); ctx.lineTo(x,y+height-radius); ctx.quadraticCurveTo(x,y+height,x+radius,y+height); ctx.lineTo(x+width-radius,y+height); ctx.quadraticCurveTo(x+width,y+height,x+width,y+height-radius); ctx.lineTo(x+width,y+radius); ctx.quadraticCurveTo(x+width,y,x+width-radius,y); ctx.lineTo(x+radius,y); ctx.quadraticCurveTo(x,y,x,y+radius); ctx.stroke();}
Конечное изображение выглядит так:
| Screenshot | Live sample |
|---|
 |
Мы не будем подробно останавливаться на том, так как это на самом деле удивительно просто. Наиболее важные вещи, которые следует отметить, это использование свойства fillStyle в контексте рисования и использование функции утилиты (в данном случае roundedRect()). Использование функций утилиты для битов чертежа часто может быть очень полезным и сократить количество необходимого кода, а также его сложность.
Позже, в этом уроке, мы ещё раз рассмотрим fillStyle, но более подробно. Здесь же мы используем его для изменения цвета заливки путей вместо цвета по умолчанию от чёрного до белого, а затем обратно.
Как мы видели в последнем примере, есть серия путей и команд для рисования объектов на вашем холсте. Чтобы упростить код и повысить производительность, объект Path2D (en-US), доступный в последних версиях браузеров, позволяет вам кешировать или записывать эти команды рисования. Вы можете быстро запускать свои пути. Давайте посмотрим, как мы можем построить объект Path2D :
Path2D() (en-US)- Конструктор
Path2D() возвращает вновь созданный объект Path2D необязательно с другим путём в качестве аргумента (создаёт копию) или необязательно со строкой, состоящей из данных пути SVG path .
new Path2D(); new Path2D(path); new Path2D(d);
Все методы path , такие как moveTo, rect, arc, или quadraticCurveTo, и т.п, которые мы уже знаем, доступны для объектов Path2D
API Path2D также добавляет способ комбинирования путей с использованием метода addPath. Это может быть полезно, если вы хотите, например, создавать объекты из нескольких компонентов.
Path2D.addPath(path [, transform]) (en-US)- Добавляет путь к текущему пути с необязательной матрицей преобразования.
В этом примере мы создаём прямоугольник и круг. Оба они сохраняются как объект Path2D, поэтому они доступны для последующего использования. С новым API Path2D несколько методов были обновлены, чтобы при необходимости принять объект Path2D для использования вместо текущего пути. Здесь stroke и fill используются с аргументом пути, например, для рисования обоих объектов на холст.
function draw() { var canvas = document.getElementById('canvas'); if (canvas.getContext){ var ctx = canvas.getContext('2d'); var rectangle = new Path2D(); rectangle.rect(10, 10, 50, 50); var circle = new Path2D(); circle.moveTo(125, 35); circle.arc(100, 35, 25, 0, 2 * Math.PI); ctx.stroke(rectangle); ctx.fill(circle); }}
| Screenshot | Live sample |
|---|
 |
Ещё одна мощная функция нового Canvas Path2D API использует данные пути SVG, SVG path data, для инициализации путей на вашем холсте. Это может позволить вам передавать данные пути и повторно использовать их как в SVG, так и в холсте.
Путь перемещается в точку (M10 10), а затем горизонтально перемещается на 80 пунктов вправо (h 80), затем на 80 пунктов вниз (v 80), затем на 80 пунктов влево (h -80), а затем обратно на start (z). Этот пример можно увидеть на странице Path2D constructor.
var p = new Path2D("M10 10 h 80 v 80 h -80 Z");
КАК рисовать в Win32 API?
КАК и где надо вставлять графические функции?КАК в нужном месте окна поставить точку?КАК рисовать линии?КАК можно задать координаты начала линии вместо функции LineTo()?КАК вывести дугу?КАК рисовать прямоугольник?КАК нарисовать закруглённый прямоугольник?КАК использовать кисти?КАК применить перья?КАК закрасить прямоугольник?КАК инвертировать цвета в нужной области экрана?КАК нарисовать эллипс?КАК прочертить хорду?КАК отделить сектор окружности?КАК нарисовать произвольный многоугольник?КАК рисуются графики? Обществом преподавателей информатики замечено, что очень многие, при изучении нового языка программирования, прежде всего интересуются его графическими возможностями. Видимо, ещё с детства в нас не остыл интерес к красивым разноцветным кружочкам и овалам. Как вы и думали, API даёт в этом плане огромнейшую свободу, ибо всё, что знает Windows о рисовании, она знает от API. Разноцветные геометрические фигуры, которые можно заливать любым цветом, эллипсы, окружности, прямоугольники, линии. Во введении я уже говорил про кисти и перья. Эта важнейшие особенности API дают нам возможность заливать фигуры не только сплошным покровом, а линии делать пунктирными и штрих-пунктирными. С текстом мы вроде как разобрались, теперь переходим к нашим любимым графическим примитивам. Так как в этой главе мы будем изучать почти все графические функции, предлагаю сделать заготовочку, в которую можно примерять новые изученные функции. КАК и где вставлять графические функции? Сам текст программы ничем не отличается от предыдущих. Рассмотрим лишь сообщение WM_PAINT. Я покажу куда рисовать.case WM_PAINT : hdc=BeginPaint(hWnd, &ps); //здесь можно вставить какие-нибудь функции рисования ... //обновляем окно ValidateRect(hWnd, NULL); //заканчиваем рисовать EndPaint(hWnd, &ps); break;Графические функции GDI:1. Вывод точки. SetPixel устанавливает заданный цвет в точке с указанными координатами:COLORREF SetPixel(HDC hDC, int x, int y, COLORREF crColor); Пример:SetPixel(hDC, 10,10, RGB(0,0,0)); Функция GetPixel соответственно возвращает цвет в заданных координатах.COLORREF Getpixel(hDC, int x, int y);2. Рисование линий. BOOL LineTo(hDC, int x, int y); Функция рисует линию от текущей позиции до места, указанного в аргументах. Чтобы изменить тип линии (толщину, стиль)- меняется тип пера. Но об этом позже. Так как в отличие от многих других подходов, в GDI нет функции рисования линии от одного указанного места до другого, её можно создать самому. Она будет соединять линией точки с координатами: x1,y1 и x2,y2.BOOL Line(HDC hdc, int x1, int y1, int x2, int y2) { MoveToEx(hdc, x1, y1, NULL); //сделать текущими координаты x1, y1 return LineTo(hdc, x2, y2); } 3. ДугаBOOL Arc(hDC, int left, int top, int right, int bottom, int x1, int y1, int x2, int y2); Первые четыре аргумента - левый верхний и правый нижний углы прямоугольника, в который вписан эллипс. Остальные значения - координаты точек, от которых будут проведены прямые к центру эллипса. В местах пересечения первой и второй прямой с радиусом эллипса, начинается и кончается дуга.4. Прямоугольник. По умолчанию прозрачный, а вообще, тип его заливки определяется текущей кистью. По умолчанию она тоже прозрачная. BOOL Rectangle(hDC, int left, int top, int right, int bottom); //аргументы - это коордианты левого верхнего и правого нижнего углов5. Закруглённый прямоугольник. Его можно использовать, как импровизированную кнопку, если не лень возиться.BOOL RoundRect(hDC, int left, int top, int right, int bottom, int width, int height); Первые пять параметров совпадают с параметрами предыдущей фукнции. Далее width и height задают ширину и высоту эллипса, дуги которого ограничивают прямоугольник. 6. Кисти. Самое время познакомиться с кистями, так как фигуры, которые пойдут дальше выглядят лучше закрашенными. Мы уже немного затронули эту тему во вводной части. Теперь рассмотрим как задать свой стиль кисти. Как и setfillstyle() в DOS, кисть закрашивает какую-то область в какой-то цвет. В зависимости от кисти, она может делать это в полосочку, в клеточку, по диагонали... Есть два способа объявить кисть. Первый - задать сплошную заливку, второй - указать стиль. Для этого существуют соответственно функции: CreateSoldBrush() и CreateHatchBrush(). Пример: HBRUSH hBrush; //создаём объект-кисть CreateSolidBrush(RGB(255,0,67)); //задаём сплошную кисть, закрашенную цветом RGB SelectObject(hdc, hBrush); //делаем кисть активной А вот как объявить не сплошную кисть:CreateHatchBrush(int fnStyle, RGB(r,g,b)); Аргумент fnStyle принимает ряд константных значений: HS_DIAGONAL - штрихует по диагонали HS_CROSS - клеточка HS_DIAGCROSS - диагональная сетка HS_FDIAGONAL - по диагонали в другую сторону HS_HORIZONTAL - горизонтальная "тельняшка" HS_VERTICAL - вертикальный "забор"HBRUSH hBrush1; CreateHatchBrush(int fnStyle, RGB(r,g,b)); SelectObject(hdc, hBrush1); //делаем кисть активной Вот махонький пример сообщения WM_PAINT с использованием кистей.//сообщение рисования case WM_PAINT : //начинаем рисовать hdc=BeginPaint(hWnd, &ps); HBRUSH hBrush; hBrush=CreateHatchBrush(HS_FDIAGONAL, RGB(255,0,0)); SelectObject(hdc,hBrush); Ellipse(hdc, 100,100,200,300); //эллипс будет заштрихован
//обновляем окно
ValidateRect(hWnd, NULL); //заканчиваем рисовать EndPaint(hWnd, &ps); break; 7. Перья. Они задают стиль линий, как и setlinestyle в DOS. Линия может быть жирной и тонкой, прерывистой и штрих-пунктирной. Всё предусмотрено. Это очень удобно для создания графиков функций, когда на график накладывается сетка, рисуются оси и выводится сама функция. Вы можете сказать, что это касается только математиков! Но почти любая фирма, что бы она не производила, иногда проводит презентации. На графике можно показать рост внешнего капитала, объём продаж и многое другое...HPEN hPen; //Объявляется кисть CreatePen(fnPenStyle, int width, RGB(r,g,b)); //Создаётся объект SelectObject(hdc, hPen); //Объект делается текущим fnStyle может принимать следующие значения: PS_SOLD - сплошная PS_DASH - состоящая из точек PS_DOT - состоящая из тире PS_DASHDOT - "точка-тире" PS_DASHDOTDOT - "тире-точка-точка-тире" PS_NULL - невидимая PS_INSIDEFRAME - обводка замкнутых фигур И пример будет такой://сообщение рисования case WM_PAINT : //начинаем рисовать hdc=BeginPaint(hWnd, &ps); HPEN hPen1, hPen2, hPen3; //объявляем сразу три объекта-пера hPen1=CreatePen(PS_DASHDOT, 1, RGB(0,0,255)); //создаём всё три hPen2=CreatePen(PS_DASH, 1, RGB(255,0,255)); hPen3=CreatePen(PS_DOT, 1, RGB(0,128,256));
SelectObject(hdc, hPen1); //но в одним момент времени может быть только 1 Rectangle(hdc, 10,10,100,100); //рисуем фигуру соответствующим пером
SelectObject(hdc, hPen2); //меняем перо Ellipse(hdc, 100,100,200,300); //рисуем другим пером
SelectObject(hdc, hPen3); LineTo(hdc, 200,100);
//обновляем окно
ValidateRect(hWnd, NULL); //заканчиваем рисовать EndPaint(hWnd, &ps); break;
Важно понять, что можно создавать хоть 10 перьев с помощью CreatePen, но применить в данный момент времени можно только 1 из них. Для этого и нужен SelectObject, чтобы окно поняло какую кисть в настоящий момент мы достаём из этюдника GDI.6. Закрашенный прямоугольник int FillRect(HDC hDC, CONST RECT *lprc, HBRUSH hbr); lprc - закрашиваемый прямоугольник типа RECT. hbr - кисть Вот пример-фрагмент WM_PAINT:RECT r; //объявляем экзмепляр структуры RECT - координаты прямоугольника. r.left=100; //левый верхний угол r.top=100; r.right=200; //правый нижний r.right=300;
//Заполняем прямоугольник FillRect(hdc, &r, (HBRUSH)CreateSolidBrush(RGB(255,0,0)));А вот и первый пример программы подоспел! Нарисуем что-то очень красивое - то, что мы уже умеем.

В этом примере мы освежим методы работы со шрифтами, поменяв стандартный системный шрифт на свой, затем нарисуем прямоугольник, заполненный красным цветом, зелёный эллипс и прямоугольник с закруглёнными краями жёлтого цвета. Естественно, что для того, чтобы их заполнить нам понадобятся кисти, а для синей рамки на жёлтом прямоугольнике понадобятся перья. Всё, что есть в этой программе вы уже умеете. Мы просто закрепляем теорию на практике.#include<windows.h> #include<string.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); char szProgName[]="Имя программы";
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { HWND hWnd; MSG lpMsg; WNDCLASS w;
w.lpszClassName=szProgName; //имя программы - объявлено выше w.hInstance=hInstance; //идентификатор текущего приложения w.lpfnWndProc=WndProc; //указатель на функцию окна w.hCursor=LoadCursor(NULL, IDC_ARROW); //загружаем курсор w.hIcon=0; w.lpszMenuName=0; w.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); //цвет фона окна w.style=CS_HREDRAW|CS_VREDRAW; w.cbClsExtra=0; w.cbWndExtra=0;
//Если не удалось зарегистрировать класс окна - выходим if(!RegisterClass(&w)) return 0;
//Создадим окно в памяти, заполнив аргументы CreateWindow hWnd=CreateWindow(szProgName, //Имя программы "Грфические возможности Win32 API", //Заголовок окна WS_OVERLAPPEDWINDOW, //Стиль окна - перекрывающееся 100, //положение окна на экране по х 100, //положение по у 500, //ширина 400, //высота (HWND)NULL, //идентификатор родительского окна (HMENU)NULL, //идентификатор меню (HINSTANCE)hInstance, //идентификатор экземпляра программы (HINSTANCE)NULL); //отсутствие дополнительных параметров
//Выводим окно из памяти на экран ShowWindow(hWnd, nCmdShow); //Обновим содержимое окна UpdateWindow(hWnd);
//Цикл обработки сообщений
while(GetMessage(&lpMsg, NULL, 0, 0)) { TranslateMessage(&lpMsg); DispatchMessage(&lpMsg); } return(lpMsg.wParam); }
//Функция окна LRESULT CALLBACK WndProc(HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam) { HDC hdc; //создаём контекст устройства PAINTSTRUCT ps; //создаём экземпляр структуры графического вывода LOGFONT lf; HFONT hFont; RECT r; HBRUSH hBrush; HPEN hPen;
//Цикл обработки сообщений switch(messg) { //сообщение рисования case WM_PAINT : hdc=BeginPaint(hWnd, &ps);
//Создаём свой шрифт strcpy(lf.lfFaceName,"Times New Roman"); //копируем в строку название шрифта lf.lfHeight=20; lf.lfItalic=1; lf.lfStrikeOut=0; lf.lfUnderline=0; lf.lfWidth=10; lf.lfWeight=40; lf.lfCharSet=DEFAULT_CHARSET; //значение по умолчанию lf.lfPitchAndFamily=DEFAULT_PITCH; //значения по умолчанию lf.lfEscapement=0;
hFont = CreateFontIndirect(&lf); SelectObject(hdc, hFont); SetTextColor(hdc, RGB(0,0,255)); TextOut(hdc, 80,40, "Красота спасёт мир!!", 20);
//рисуем красный прямоугольник r.top=100; r.left=180; r.right=400; r.bottom=300; FillRect(hdc, &r, HBRUSH(CreateSolidBrush(RGB(255,0,55))));
//рисуем зелёный эллипс hBrush=CreateSolidBrush(RGB(10,200,100)); SelectObject(hdc, hBrush); Ellipse(hdc, 20,100,200,200);
//рисуем закруглённый прямоугольник hBrush=CreateSolidBrush(RGB(250,200,100)); SelectObject(hdc, hBrush); hPen=CreatePen(2,2,RGB(0,0,255)); SelectObject(hdc, hPen); RoundRect(hdc, 20, 250, 250, 350, 15, 15);
ValidateRect(hWnd, NULL); EndPaint(hWnd, &ps); break;
//сообщение выхода - разрушение окна case WM_DESTROY: PostQuitMessage(0); //Посылаем сообщение выхода с кодом 0 - нормальное завершение DeleteObject(hPen); DeleteObject(hBrush); break;
default: return(DefWindowProc(hWnd, messg, wParam, lParam)); //освобождаем очередь приложения от нераспознаных } return 0; }
Правда, красиво? Наконец-то из этой API нам удалось выжать что-то стоящее. Продолжаем обзор. 7. Прямоугольная рамка - как видите, существует немало функций для работы с прямоугольниками:int FrameRect(HDC hDC, CONST RECT *lprc, HBRUSH hbr); Применение аналогично предыдущей.8. Инверсия значения цветов точек в заданной областиBOOL InvertRect(HDC hDC, CONST RECT *lprc);9. ЭллипсBOOL Ellipse(HDC hdc, int x1, int y1, int x2, int y2); координаты - это прямоугольник, в который вписывается эллипс10. Хорда (сегмент эллипса) - параметры аналогичны Arc BOOL Chord(HDC hDC, int left, int top, int right, int bottom, int x1, int y1, int x2, int y2); Функция соединяет хордой точки начала и конца дуги эллипса и закрашивает выделенный сегмент текущей кистью. 11. Сектор эллипса - аналог pieslice в DOS. BOOL Pie(HDC hDC, int left, int top, int right, int bottom, int x1, int y1, int x2, int y2);12. Многоугольник. Есть много функций рисования мноугольников. Мы рассмотрим две. Рисования от вершины к вершине и рисования отрезками: PolyDraw оперирует вершинами:POINT poly[8]; BYTE polytype[8]; poly[0].x=375; //координаты первой вершины poly[0].y=375; ....//и так заполняем координаты всех восьми вершин poly[7].x=400; //координаты восьмой вершины poly[7].y =400; polytype[0]=PT_LINETO; ... //другой массив содержит режим рисования polytype[7]=PT_LINETO; PolyDraw(hdc, poly, polytype, 8); //рисование многоугольника Функция Polyline рисует набором отрезков:POINT poly[4];
poly[0].x =10; poly[0].y =30;
poly[1].x =30; poly[1].y =30;
poly[2].x =30; poly[2].y =60;
poly[3].x=10; poly[3].y=30;
Polyline(hdc, poly , 4);КАК вывести график функции? Всё это были фрагменты графических функций. Теперь рассмотрим настоящий полноценный пример. Это будет простейший график функции.
 | Вообще графики очень часто используются в промышленных приложениях. А ведь промышленная автоматизация один из главныз заказчиков программиста. На деле никто не занимается программированием ради программирования. Обязательно придётся осваивать какую-то ещё предметную область. Будь то склад для программиста баз данных или производство упаковок для системного программиста. Так или иначе, программы, контроллирующие какой-нибудь физический парметр (температуру больного, давление в шахте, скорость двигателя, частоту оборотов, напряжённость магнитного поля) выводят оперативную информацию на грфик. Специальный человек - оператор следит за тем, чтобы значения графика не достигали предельных значений. Как вы сами понимаете, мы не можем обойти столь важную тему. Именно для неё наша следующая программа. Создайте пустой проект Win API и включите в него следующий текст: |
#include<windows.h> #include<math.h>
#define pi 3.14
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //Процедура рисования линии BOOL Line(HDC hdc, int x1, int y1, int x2, int y2);
char szProgName[]="Имя программы";
int i, xView, yView; double y; char Buf[2];
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { HWND hWnd; MSG lpMsg; WNDCLASS w;
w.lpszClassName=szProgName; w.hInstance=hInstance; w.lpfnWndProc=WndProc; w.hCursor=LoadCursor(NULL, IDC_ARROW); w.hIcon=0; w.lpszMenuName=0; w.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); w.style=CS_HREDRAW|CS_VREDRAW; w.cbClsExtra=0; w.cbWndExtra=0;
//Если не удалось зарегистрировать класс окна - выходим if(!RegisterClass(&w)) return 0;
//Создадим окно в памяти, заполнив аргументы CreateWindow hWnd=CreateWindow(szProgName, "График функции", WS_OVERLAPPEDWINDOW, 100, 100, 500, 400, (HWND)NULL, (HMENU)NULL, (HINSTANCE)hInstance, (HINSTANCE)NULL);
//Выводим окно из памяти на экран ShowWindow(hWnd, nCmdShow); //Обновим содержимое окна UpdateWindow(hWnd);
//Цикл обработки сообщений
while(GetMessage(&lpMsg, NULL, 0, 0)) { //Получаем сообщение из очереди TranslateMessage(&lpMsg); //Преобразует сообщения клавиш в символы DispatchMessage(&lpMsg); //Передаёт сообщение соответствующей функции окна } return(lpMsg.wParam); }
//Функция окна LRESULT CALLBACK WndProc(HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam) { HDC hdc; //создаём контекст устройства PAINTSTRUCT ps; //создаём экземпляр структуры графического вывода HPEN hPen; //создаём перо //Цикл обработки сообщений switch(messg) {
case WM_SIZE: xView=LOWORD(lParam); yView=HIWORD(lParam);
break; //сообщение рисования case WM_PAINT: hdc = BeginPaint(hWnd, &ps); SetMapMode(hdc, MM_ISOTROPIC); //логические единицы отображаем, как физические SetWindowExtEx(hdc, 500,500, NULL); //Длина осей SetViewportExtEx(hdc, xView, -yView, NULL); //Определяем облась вывода SetViewportOrgEx(hdc, xView/6, yView/2, NULL); //Начало координат //Рисуем оси координат Line(hdc,0, 220,0,-220);//ось У Line(hdc, -100,0,500,0);//ось Х MoveToEx(hdc, 0,0,NULL); //перемещаемся в начало координат
//Создание красного пера hPen=CreatePen(1,4,RGB(255,25,0)); SelectObject(hdc, hPen);
//синусоида for(i=0; i<450; i++){ y=180.0*(exp(-i*0.01))*sin(pi*i*(200.0/400.0)/180.0); LineTo(hdc, i, (int)y); }
//Делаем перо снова чёрным hPen=CreatePen(1,1,RGB(0,0,0)); SelectObject(hdc, hPen);
//Наносим деления for(i=-100; i<500; i+=100) { Line(hdc, i, 3,i,-3); Line(hdc, -3, i,3,i); itoa(i, Buf, 10); TextOut(hdc, i-5, -5, Buf , strlen(Buf)); TextOut(hdc, -5, i, Buf , strlen(Buf)); } ValidateRect(hWnd, NULL); //Обновляем экран EndPaint(hWnd, &ps); break;
//сообщение выхода - разрушение окна case WM_DESTROY: DeleteObject(hPen); //не забываем уничтожать перья PostQuitMessage(0); //Посылаем сообщение выхода с кодом 0 - нормальное завершение break;
default: return(DefWindowProc(hWnd, messg, wParam, lParam)); //освобождаем очередь приложения от нераспознаных } return 0; } //Функция рисования линии BOOL Line(HDC hdc, int x1, int y1, int x2, int y2) { MoveToEx(hdc, x1, y1, NULL); //сделать текущими координаты x1, y1 return LineTo(hdc, x2, y2); //нарисовать линию }
Поскольку в данной программе большое внимание уделяется всяким украшательствам: делениям и надписям, обращу ваше внимание на главное - создавать графики совсем не сложно. И вот как это делается: Мы знаем, что отсчёт координат задаётся от левого верхнего угла вниз и вправо. Как известно, значения на графике изменяются вверх и вправо. Вряд ли мы сможем объяснить пользователю, почему график "растёт вниз". На счастье, в Windows предусмотрена функция, преобразует координаты в нужном нам направлении. Первым делом, мы узнаём размер окна. Для этого используется сообщение WM_SIZE. Параметр lParam содержит по этому сообщению размеры экрана. Переменные xView и yView будут содержать эти значения: case WM_SIZE: xView=LOWORD(lParam); yView=HIWORD(lParam);break;
Затем определим область вывода. Мы хотим, чтобы при увеличении координаты по у график рос вверх, а не вниз. SetViewportExtEx(hdc, xView, -yView, NULL); Обратите внимание: yView указан со знаком -. Значит все координаты по у будут расти в обратную сторону - вверх. Центр графика обычно где-нибудь посередине экрана. Координаты же увеличиваются из левого верхнего угла. Перенесём центр графика:SetViewportOrgEx(hdc, xView/6, yView/2, NULL);В точке, равной 1/6 максимального значения по х и 1/2 значения по этого значения по у будет центр. Можно также задать длину осей - 500 и 500. Для этого применяется следующая функция:SetWindowExtEx(hdc, 500,500, NULL); Как вы уже знаете, окно имеет логические координаты и физические. Для того, чтобы логические координаты совпадали с физическими, а также, чтобы единица отложенная по х была равно единице отложенной по у, задаётся режим MM_ISOTROPIC. Его задаёт функция:SetMapMode(hdc, MM_ISOTROPIC); Вот, как будет выглядеть эта конструкция вцелом:SetMapMode(hdc, MM_ISOTROPIC); //логические единицы отображаем, как физические SetWindowExtEx(hdc, 500,500, NULL); //Длина осей SetViewportExtEx(hdc, xView, -yView, NULL); //Определяем облась вывода SetViewportOrgEx(hdc, xView/6, yView/2, NULL); //Начало координат Дальше надо нарисовать оси. К нашей радости, точка 0, 0 сместилась на середину экрана, в левую его часть. Исходя из этого, рисуем оси, применяя самописную функцию Line: Line(hdc,0, 220,0,-220);//ось У Line(hdc, -100,0,500,0);//ось Х MoveToEx(hdc, 0,0,NULL);
В выводе графика нет ничего примечательного. Переменная i меняется от 0 до 450. Подставляя i в формулу, мы получаем зависимость y от i. Рисуем линию до этой точки. Небольшие отрезки сольются в непрерывную линию. for(i=0; i<450; i++){ y=180.0*(exp(-i*0.01))*sin(pi*i*(200.0/400.0)/180.0); LineTo(hdc, i, (int)y); }
Иногда, требуется хранить значения физических величин несколько дней. Тогда график выполняется с длиннющей горизонтальной полосой прокрутки. При желании, можно вернуться и посмотреть были ли изменения, и если да, то какие. Другой выход из положения - вести историю, записывая её в файл, а на экран выводя только показания последних пяти минут.
Задания:
1. Добавьте в приложения с графиком стрелочки и подписи к осям. 2. Нарисуйте снеговика известными средствами GDI. Напомню, что снеговик состоит из трёх непрозрачных эллипсов грязно-белого цвета, на груди у него должны быть пуговки, в руке - метла, а на голове - ведро. 3. Нарисуйте красивый паровозик, клубы из трубы которого будут выводиться в цикле в виде синих эллипсов 4. Нарисуйте кораблик с жёлтой палубой и красными бортами, используя Polyline или Polydraw. Кораблик покоится на синих волнах, которые нарисованы дугами разной толщины. Попробуйте вывести дуги в цикле. 5. Нарисуйте с помощью одних только линий домик с забором
Назад ГлавнаяВперёд
Вы можете добавлять линии, чтобы соединять фигуры или выделять данные, а также удалять их.
Рисование линии с точками соединения
Соединительной линией называется линия, на концах которой находятся точки соединения, используемые для ее прикрепления к фигурам. Соединительный линия может быть прямым

, изогнутым
или изогнутым

. При выборе соединительной линии на контуре фигуры появляются точки. Они показывают, куда можно прикрепить линию.
Важно: В Word и Outlook точки соединения можно использовать только в том случае, когда линии и объекты, к которым они прикрепляются, помещены на полотно. Чтобы вставить полотно, на вкладке Вставка нажмите кнопку Фигуры и щелкните Новое полотно в нижней части меню.
Чтобы добавить линию, которая прикрепляется к другим объектам, выполните следующие действия:
На вкладке Вставка в группе элементов Иллюстрации нажмите кнопку Фигуры.

В группе Линии выберите соединительную линию, которую вы хотите добавить.

Примечание: Последние три типа в разделе Линия ("Кривая", "Полилиния: фигура" и "Полилиния: рисованная кривая") не являются соединительными линиями. Наведите указатель мыши на тип, чтобы просмотреть его название, прежде чем щелкать его.
Чтобы нарисовать линию, соединяющую фигуры, наведите указатель мыши на первую фигуру или объект.
Появятся точки соединения, говорящие о том, что линию можно прикрепить к фигуре. (Цвет и тип этих точек зависит от версии Office.)

Примечание: Если точки соединения не выводятся, вы либо выбрали линию, которая не является соединительной, либо работаете не на полотне (в Word или Outlook).
Щелкните первую фигуру и перетащите указатель к точке соединения на втором объекте.
Примечание: Когда вы изменяете положение фигур, связанных соединителями, соединители не открепляются от фигур и перемещаются вместе с ними. Если вы переместите конец соединителя, он открепится от фигуры и его можно будет прикрепить к другой точке соединения той же фигуры или к другой фигуре. Если соединитель прикреплен к точке соединения, он остается связан с фигурой, как бы вы ее не перемещали.
Рисование линии без точек соединения
Чтобы добавить линию, которая не прикреплена к другим объектам, выполните следующие действия:
На вкладке Вставка в группе элементов Иллюстрации нажмите кнопку Фигуры.

В группе Линии, выберите любой тип линии.

Щелкните в нужном месте документа, переместите указатель в другое место, удерживая нажатой кнопку мыши, а затем отпустите ее.
Дублирование линии
Если вам требуется несколько раз добавить в документ одну и ту же линию, это можно быстро сделать с помощью команды "Зафиксировать режим рисования".
На вкладке Вставка в группе элементов Иллюстрации нажмите кнопку Фигуры.

В разделе Линии щелкните правой кнопкой мыши линию или фигуру, которую вы хотите добавить, и выберите команду Зафиксировать режим рисования.

Щелкните в том месте, где должна начинаться линия или соединитель, а затем перетащите курсор в то место, где она должна заканчиваться.
Повторите шаг 3 для каждой линии, которую вы хотите добавить.
Когда вы добавите все линии или соединители, нажмите клавишу ESC.
Добавление, изменение и удаление стрелки или фигуры линии
Выберите линию, которую вы хотите изменить.Для работы с несколькими строками выберите первую, а затем, удерживая нажатой кнопку CTRL, выберем остальные.
На вкладке Формат щелкните стрелку Контур фигуры.
Если вы не видите вкладку Формат, убедитесь, что вы выбрали линию. Для этого может потребоваться дважды щелкнуть ее.
Наведите указатель на пункт Стрелки и щелкните нужный тип стрелки.
Чтобы изменить тип или размер стрелки, а также тип, ширину и цвет линии, щелкните Другие стрелки и задайте необходимые параметры.

Чтобы удалить стрелку, щелкните первый тип Стрелка: стиль 1 (без наконечников).
Удаление линий
Щелкните линию, соединитель или фигуру, которые вы хотите удалить, а затем нажмите клавишу DELETE.Если вы хотите удалить несколько линий или соедините линий, выберите первую, а затем, удерживая нажатой кнопку CTRL, выберите остальные, а затем нажмите удалить.
>