Какой класс определяет перо рисующее контур фигуры
Перейти к содержимому

Какой класс определяет перо рисующее контур фигуры

  • автор:

Какой класс определяет перо рисующее контур фигуры

Скачай курс
в приложении

Перейти в приложение
Открыть мобильную версию сайта

© 2013 — 2024. Stepik

Наши условия использования и конфиденциальности

Get it on Google Play

Public user contributions licensed under cc-wiki license with attribution required

Рисование фигур и контуров с помощью инструмента «Перо»

Инструмент «Перо» позволяет рисовать плавные контуры с опорными точками и ручками.

Инструмент «Перо» в Photoshop

Выберите инструмент «Перо» (P) .

На панели «Параметры» можно настроить параметры инструмента, такие как Режим рисования и Автоматическое добавление/удаление опорных точек, чтобы получить желаемый результат.

Нарисуйте контур с опорными точками и ручками.

  • Замкнутый контур: расположите инструмент над первой (пустой) опорной точкой и щелкните или перетащите мышь.
  • Незамкнутый контур: щелкните, удерживая клавишу «Ctrl» (Windows) или «Command» (Mac OS), в любом месте на достаточном расстоянии от любых объектов.

Класс CPen

Инкапсулирует перо интерфейса графических устройств Windows (GDI).

Синтаксис

class CPen : public CGdiObject 

Участники

Открытые конструкторы

Имя Описание
CPen::CPen Формирует объект CPen .

Открытые методы

Имя Описание
CPen::CreatePen Создает логическую косметику или геометрическое перо с указанным стилем, шириной и атрибутами кисти и присоединяет его к объекту CPen .
CPen::CreatePenIndirect Создает перо со стилем, шириной и цветом LOGPEN , заданным в структуре, и присоединяет его к объекту CPen .
CPen::FromHandle Возвращает указатель на CPen объект при указании Windows HPEN.
CPen::GetExtLogPen Возвращает базовую структуру EXTLOGPEN .
CPen::GetLogPen Возвращает базовую структуру LOGPEN .

Открытые операторы

Имя Описание
CPen::operator HPEN Возвращает дескриптор Windows, подключенный к объекту CPen .

Замечания

Дополнительные сведения об использовании CPen см. в разделе «Графические объекты».

Иерархия наследования

Требования

Заголовок. afxwin.h

CPen::CPen

Формирует объект CPen .

CPen(); CPen( int nPenStyle, int nWidth, COLORREF crColor); CPen( int nPenStyle, int nWidth, const LOGBRUSH* pLogBrush, int nStyleCount = 0, const DWORD* lpStyle = NULL); 

Параметры

nPenStyle
Задает стиль пера. Этот параметр в первой версии конструктора может быть одним из следующих значений:

  • PS_SOLID Создает сплошное перо.
  • PS_DASH Создает дефисное перо. Допустимо только в том случае, если ширина пера составляет 1 или меньше, в единицах устройства.
  • PS_DOT Создает пунктирное перо. Допустимо только в том случае, если ширина пера составляет 1 или меньше, в единицах устройства.
  • PS_DASHDOT Создает перо с чередующимися тире и точками. Допустимо только в том случае, если ширина пера составляет 1 или меньше, в единицах устройства.
  • PS_DASHDOTDOT Создает перо с чередующимися дефисами и двойными точками. Допустимо только в том случае, если ширина пера составляет 1 или меньше, в единицах устройства.
  • PS_NULL Создает пустое перо.
  • PS_INSIDEFRAME Создает перо, которое рисует линию внутри кадра закрытых фигур, созданных выходными функциями Windows GDI, которые указывают ограничивающий прямоугольник (например, Ellipse функции элементов , , Rectangle RoundRect и Chord Pie т. д.). Если этот стиль используется с выходными функциями Windows GDI, которые не указывают ограничивающий прямоугольник (например, LineTo функция-член), область рисования пера не ограничивается кадром.

Вторая версия конструктора задает сочетание типов, стиля, конечной CPen крышки и атрибутов соединения. Значения из каждой категории должны объединяться с помощью побитового оператора «или» ( | ). Тип пера может быть одним из следующих значений:

  • PS_GEOMETRIC Создает геометрическое перо.
  • PS_COSMETIC Создает косметический перо. Вторая версия конструктора CPen добавляет следующие стили пера для nPenStyle :
  • PS_ALTERNATE Создает перо, которое задает каждый другой пиксель. (Этот стиль применим только для косметических перьев.)
  • PS_USERSTYLE Создает перо, использующее массив стилизации, предоставленный пользователем. Конечное ограничение может быть одним из следующих значений:
  • PS_ENDCAP_ROUND Конечные крышки округляются.
  • PS_ENDCAP_SQUARE Конечные крышки являются квадратными.
  • PS_ENDCAP_FLAT Конечные крышки плоские. Соединение может быть одним из следующих значений:
  • PS_JOIN_BEVEL Соединения разложены.
  • PS_JOIN_MITER Соединения митерируются, когда они находятся в пределах текущего ограничения, заданного SetMiterLimit функцией. Если соединение превышает это ограничение, оно выстроено.
  • PS_JOIN_ROUND Соединения округляются.

nWidth
Задает ширину пера.

  • Для первой версии конструктора значение 0 будет обрабатываться аналогично значению 1, за исключением того, что ширина не будет влиять на операции преобразования масштабирования, действующие для объекта графики, для которых используется перо; Ширина всегда будет иметь 1 пиксель.
  • Для второй версии конструктора, если nPenStyle есть PS_GEOMETRIC , ширина будет указана в логических единицах. В противном nPenStyle PS_COSMETIC случае ширина должна иметь значение 1.

crColor
Содержит цвет RGB для пера.

pLogBrush
Указывает на структуру LOGBRUSH . Если nPenStyle есть PS_COSMETIC , lbColor элемент LOGBRUSH структуры указывает цвет пера и lbStyle элемент LOGBRUSH структуры должен иметь значение BS_SOLID . Если nPenStyle есть PS_GEOMETRIC , все элементы должны использоваться для указания атрибутов кисти пера.

nStyleCount
Задает длину в единицах двойного слова массива lpStyle . Это значение должно быть равно нулю, если nPenStyle это не PS_USERSTYLE так.

lpStyle
Указывает на массив значений doubleword. Первое значение указывает длину первого тире в пользовательском стиле, второе значение указывает длину первого пробела и т. д. Этот указатель должен быть NULL , если nPenStyle это не PS_USERSTYLE так.

Замечания

Если конструктор используется без аргументов, необходимо инициализировать результирующий CPen объект с CreatePen CreatePenIndirect помощью функций-членов или CreateStockObject функций-членов.

Если вы используете конструктор, который принимает аргументы, то дальнейшая инициализация не требуется. Конструктор с аргументами может вызвать исключение, если возникают ошибки, в то время как конструктор без аргументов всегда будет выполнен успешно.

Пример

// Create a solid red pen of width 2. CPen myPen1(PS_SOLID, 2, RGB(255, 0, 0)); // Create a geometric pen. LOGBRUSH logBrush; logBrush.lbStyle = BS_SOLID; logBrush.lbColor = RGB(0, 255, 0); CPen myPen2(PS_DOT | PS_GEOMETRIC | PS_ENDCAP_ROUND, 2, &logBrush); 

CPen::CreatePen

Создает логическую косметику или геометрическое перо с указанным стилем, шириной и атрибутами кисти и присоединяет его к объекту CPen .

BOOL CreatePen( int nPenStyle, int nWidth, COLORREF crColor); BOOL CreatePen( int nPenStyle, int nWidth, const LOGBRUSH* pLogBrush, int nStyleCount = 0, const DWORD* lpStyle = NULL); 

Параметры

nPenStyle
Задает стиль пера. Список возможных значений см nPenStyle . в конструкторе CPen .

nWidth
Задает ширину пера.

  • Для первой версии CreatePen значение 0 будет обрабатываться аналогично значению 1, за исключением того, что ширина не будет влиять на операции преобразования масштабирования, которые применяются для графического объекта, используемого пером; ширина всегда будет 1 пиксель.
  • Для второй версии CreatePen , если nPenStyle имеется PS_GEOMETRIC , ширина указана в логических единицах. В противном nPenStyle PS_COSMETIC случае ширина должна иметь значение 1.

crColor
Содержит цвет RGB для пера.

pLogBrush
Указывает на структуру LOGBRUSH . Если nPenStyle есть PS_COSMETIC , lbColor элемент LOGBRUSH структуры указывает цвет пера и lbStyle элемент LOGBRUSH структуры должен иметь значение BS_SOLID . Если nPenStyle есть PS_GEOMETRIC , все элементы должны использоваться для указания атрибутов кисти пера.

nStyleCount
Задает длину в единицах двойного слова массива lpStyle . Это значение должно быть равно нулю, если nPenStyle это не PS_USERSTYLE так.

lpStyle
Указывает на массив значений doubleword. Первое значение указывает длину первого тире в пользовательском стиле, второе значение указывает длину первого пробела и т. д. Этот указатель должен быть NULL , если nPenStyle это не PS_USERSTYLE так.

Возвращаемое значение

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

Замечания

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

Пера, имеющие ширину больше 1 пикселя, всегда должны иметь PS_NULL либо стиль, PS_SOLID PS_INSIDEFRAME либо стиль.

Если перо имеет PS_INSIDEFRAME стиль и цвет, который не соответствует цвету в логической таблице цветов, перо рисуется с тронутыми цветами. Стиль PS_SOLID пера нельзя использовать для создания пера с тротым цветом. Стиль PS_INSIDEFRAME идентичен PS_SOLID , если ширина пера меньше или равна 1.

Вторая версия инициализирует CreatePen логическую косметику или геометрическое перо, которое имеет указанный стиль, ширину и атрибуты кисти. Ширина косметического пера всегда равна 1; Ширина геометрического пера всегда указывается в единицах мира. После создания логического пера приложение может выбрать его в контекст устройства, вызвав функцию CDC::SelectObject . После выбора пера в контексте устройства его можно использовать для рисования линий и кривых.

  • Если nPenStyle есть PS_COSMETIC и PS_USERSTYLE , записи в массиве lpStyle указывают длину дефисов и пробелов в единицах стиля. Единица стиля определяется устройством, в котором перо используется для рисования линии.
  • Если nPenStyle есть PS_GEOMETRIC и PS_USERSTYLE , записи в массиве lpStyle указывают длину дефисов и пробелов в логических единицах.
  • Если nPenStyle это PS_ALTERNATE так, единица стиля игнорируется и задается каждый другой пиксель.

Если приложению больше не требуется заданное перо, он должен вызывать CGdiObject::DeleteObject функцию-член или уничтожать CPen объект, чтобы ресурс больше не использовался. Приложение не должно удалять перо при выборе пера в контексте устройства.

Пример

CPen myPen1, myPen2; // Create a solid red pen of width 2. myPen1.CreatePen(PS_SOLID, 2, RGB(255, 0, 0)); // Create a geometric pen. LOGBRUSH logBrush; logBrush.lbStyle = BS_SOLID; logBrush.lbColor = RGB(0, 255, 0); myPen2.CreatePen(PS_DOT | PS_GEOMETRIC | PS_ENDCAP_ROUND, 2, &logBrush); 

CPen::CreatePenIndirect

Инициализирует перо, которое имеет стиль, ширину и цвет, заданный в структуре, lpLogPen на которую указывает.

BOOL CreatePenIndirect(LPLOGPEN lpLogPen); 

Параметры

lpLogPen
Указывает на структуру Windows LOGPEN , содержащую сведения о пере.

Возвращаемое значение

Ненулевое значение, если функция выполнена успешно; в противном случае — 0.

Замечания

Пера, имеющие ширину больше 1 пикселя, всегда должны иметь PS_NULL либо стиль, PS_SOLID PS_INSIDEFRAME либо стиль.

Если перо имеет PS_INSIDEFRAME стиль и цвет, который не соответствует цвету в логической таблице цветов, перо рисуется с тронутыми цветами. Стиль PS_INSIDEFRAME идентичен PS_SOLID , если ширина пера меньше или равна 1.

Пример

LOGPEN logpen; CPen cMyPen; // Get the LOGPEN of an existing pen. penExisting.GetLogPen(&logpen); // Change the color to red and the width to 2. logpen.lopnWidth.x = 2; logpen.lopnColor = RGB(255, 0, 0); // Create my pen using the new settings. cMyPen.CreatePenIndirect(&logpen); 

CPen::FromHandle

Возвращает указатель на CPen объект, заданный дескриптором пера Windows GDI.

static CPen* PASCAL FromHandle(HPEN hPen); 

Параметры

hPen
HPEN дескриптор пера GDI Для Windows.

Возвращаемое значение

Указатель на объект в случае успешного CPen выполнения; в противном случае NULL .

Замечания

CPen Если объект не присоединен к дескриптору, создается и присоединяется временный CPen объект. Этот временный объект действителен только в следующий раз, когда приложение имеет время простоя CPen в цикле событий, в то время как все временные графические объекты удаляются. Другими словами, временный объект действителен только во время обработки одного сообщения окна.

Пример

// Convert an HPEN to a CPen*. // NOTE: hPen is a valid pen handle. CPen* pPen = CPen::FromHandle(hPen); 

CPen::GetExtLogPen

Возвращает базовую структуру EXTLOGPEN .

int GetExtLogPen(EXTLOGPEN* pLogPen); 

Параметры

pLogPen
Указывает на структуру EXTLOGPEN , содержащую сведения о пере.

Возвращаемое значение

Имеет ненулевое значение в случае успешного выполнения, иначе — 0.

Замечания

Структура EXTLOGPEN определяет стиль, ширину и атрибуты кисти пера. Например, вызов GetExtLogPen для сопоставления определенного стиля пера.

Дополнительные сведения об атрибутах пера см. в следующих разделах пакета SDK для Windows.

Пример

В следующем примере кода показано, как получить GetExtLogPen атрибуты пера, а затем создать новый косметический перо с тем же цветом.

EXTLOGPEN extlogpen; penExisting.GetExtLogPen(&extlogpen); CPen penOther; LOGBRUSH LogBrush = < extlogpen.elpBrushStyle, extlogpen.elpColor, extlogpen.elpHatch >; penOther.CreatePen(PS_COSMETIC, 1, &LogBrush); 

CPen::GetLogPen

Возвращает базовую структуру LOGPEN .

int GetLogPen(LOGPEN* pLogPen); 

Параметры

pLogPen
Указывает на LOGPEN структуру, содержащую сведения о перо.

Возвращаемое значение

Имеет ненулевое значение в случае успешного выполнения, иначе — 0.

Замечания

Структура LOGPEN определяет стиль, цвет и шаблон пера.

Например, вызов GetLogPen для сопоставления определенного стиля пера.

Дополнительные сведения об атрибутах пера см. в следующих разделах пакета SDK для Windows.

Пример

В следующем примере кода показано, как получить GetLogPen символ пера, а затем создать новое сплошное перо с одинаковым цветом.

LOGPEN logpen; penExisting.GetLogPen(&logpen); CPen penOther(PS_SOLID, 0, logpen.lopnColor); 

CPen::operator HPEN

Возвращает присоединенный дескриптор CPen GDI Windows объекта.

operator HPEN() const; 

Возвращаемое значение

В случае успешного выполнения дескриптор объекта GDI Windows, представленного CPen объектом; в противном случае NULL .

Замечания

Этот оператор является оператором приведения, который поддерживает прямое использование HPEN объекта.

Дополнительные сведения об использовании графических объектов см. в статье «Графические объекты » в пакете SDK для Windows.

Пример

// Create a solid red pen of width 2. CPen myPen(PS_SOLID, 2, RGB(255, 0, 0)); // Get the handle of the pen object. HPEN hPen = (HPEN)myPen; 

Какой класс определяет перо рисующее контур фигуры

На этом шаге мы перечислим методы, используемые для рисования линий и фигур .

После захвата контекста рисования следует установить перо и кисть. С помощью пера производится рисование точек, линий и контуров фигур, а с помощью кисти — заполнение фона фигур. Установить перо позволяет метод setPen() класса QPainter . Форматы метода:

setPen() setPen() setPen(Стиль пера>)

Для установки кисти предназначен метод setBrush() . Форматы метода:

setBrush() setBrush(Стиль кисти>)

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


    drawPoint () — рисует точку. Форматы метода:

drawPoint(, ) drawPoint() drawPoint()
drawPoints([, . ) drawPoints([, . ) drawPoints() drawpoints()
drawLine() drawLine() drawLine(, ) drawLine(, ) drawLine(, , , )
drawLines([, . ) drawLines([, . ]) drawLines(Список с экземплярами класса QLineF>) drawLines([, . ]) drawLines([, . ])

Замечание . В документации по PyQt5 также заявлена поддержка форматов:

drawLines(Список с экземплярами класса QLine>) drawLines(Список с экземплярами класса QPoint>) drawLines(Список с экземплярами класса QPointF>)
drawPolyline([, . ]) drawPolyline([, . ]) drawPolyline() drawPolyline()
drawRect(, , , ) drawRect() drawRect()
fillRect(, , Ширина>, Высота>, Заливка>) fillRect(, Заливка>) fillRect(, Заливка>)

< Заливка >может быть задана экземплярами классов , , в виде стиля кисти или атрибута цвета;

drawRoundedRect(, , Ширина>, Высота>, Скругление по горизонтали> Скругление по вертикали> [, mode = Qt::AbsoluteSize]) drawRoundedRect(, Скругление по горизонтали>, Скругление по вертикали> [, mode = Qt::AbsoluteSize]) drawRoundedRect(, Скругление по горизонтали>, Скругление по вертикали> [, mode = Qt::AbsoluteSize])

  • AbsoluteSize ( или 0) — радиусы указываются в пикселях;
  • RelativeSize ( или 1) — радиусы указываются в процентах от соответствующего размера рисуемого прямоугольника;

drawPolygon([, . ) drawPolygon([, . ]) drawPolygon([, fillRule=OddEvenFill]) drawPolygon([, fillRule=OddEvenFill])

Необязательный параметр fillRule задает алгоритм определения, находится ли какая-либо точка внутри нарисованного прямоугольника или вне его. В качестве его значения указывается атрибут OddEvenFill ( или 0) или WindingFill ( или l) класса QtCore.Qt ;

drawEllipse(, , , ) drawEllipse() drawEllipse() drawEllipse(, , ) drawEllipse(, , )

В первых трех форматах указываются координаты и размеры прямоугольника, в который необходимо вписать эллипс. В двух последних форматах первый параметр задает координаты центра, параметр rX — радиус по оси х , а параметр rY — радиус по оси Y ;

drawArc(, , Ширина>, Высота>, Начальный угол>, Угол>) drawArc(, Начальный угол>, Угол>) drawArc(, Начальный угол>, Угол>)

Следует учитывать, что значения углов задаются в значениях 1/16°. Полный круг эквивалентен значению 5760 = 16 * 360. Нулевой угол находится в позиции «трех часов». Положительные значения углов отсчитываются против часовой стрелки, а отрицательные — по часовой стрелке:

drawChord(, , Ширина>, Высота>, Начальный угол>, Угол>) drawChord(, Начальный угол>, Угол>) drawChord(, Начальный угол>, Угол>)
drawPie(, , Ширина>, Высота>, Начальный угол>, Угол>) drawPie(, Начальный угол>, Угол>) drawPie(, Начальный угол>, Угол>)

При выводе некоторых фигур (например, эллипса) контур может отображаться в виде «лесенки». Чтобы сгладить контуры фигур, следует вызвать метод setRenderHint() и передать ему в качестве единственного параметра атрибут Antialiasing класса QPainter . Пример:

painter.setRenderHint(QtGui.QPainter.Antialiasing)

В заключение приведем пример программы, выводящей графическую информацию, снабженную небольшими комментариями (программа взята отсюда: https://pythonworld.ru/gui/pyqt5-painting.html ). Как видно из нее, все методы рисования вызываются из метода paintEvent() и располагаются между методами begin() и end() объекта класса QPainter() .

import sys from PyQt5.QtWidgets import QWidget, QApplication from PyQt5.QtGui import QPainter, QColor, QBrush class Example(QWidget): def __init__(self): # super() - запуск конструктора-родителя super().__init__() self.initUI() # Главный метод def initUI(self): self.setGeometry(300, 300, 350, 100) self.setWindowTitle('Прямоугольники') self.show() def paintEvent(self, e): qp = QPainter() qp.begin(self) self.drawRectangles(qp) # Рисование фигур qp.end() def drawRectangles(self, qp): col = QColor(0, 0, 0) col.setNamedColor('#d4d4d4') qp.setPen(col) # Установка карандаша qp.setBrush(QColor(200, 0, 0)) # Установка кисти qp.drawRect(10, 15, 90, 60) # Рисование прямоугольника qp.setBrush(QColor(255, 80, 0, 160)) qp.drawRect(130, 15, 90, 60) qp.setBrush(QColor(25, 0, 90, 200)) qp.drawRect(250, 15, 90, 60) app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())

Архив с файлом можно взять здесь.

Результат работы приложения изображен на рисунке 1.

Рис.1. Результат работы приложения

На следующем шаге мы рассмотрим вывод текста .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *