Какой класс определяет перо рисующее контур фигуры
Скачай курс
в приложении
Перейти в приложение
Открыть мобильную версию сайта
© 2013 — 2024. Stepik
Наши условия использования и конфиденциальности
Public user contributions licensed under cc-wiki license with attribution required
Рисование фигур и контуров с помощью инструмента «Перо»
Инструмент «Перо» позволяет рисовать плавные контуры с опорными точками и ручками.
Выберите инструмент «Перо» (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. Результат работы приложения
На следующем шаге мы рассмотрим вывод текста .