Руководство программиста в Photon (1037671), страница 47
Текст из файла (страница 47)
Вам нет необходимости устанавливать эти атрибуты, если Вы используете виджеты; атрибуты прорисовки устанавливаются на основании определений и ресурсов виджетов.
Общие атрибуты
Функциями, устанавливающими общие атрибуты рисования, являются:
PgDefaultMode() | Сброс режима прорисовки и маски плоскостей в значения, принимаемые по умолчанию |
PgSetDrawMode() | Установка режима прорисовки |
PgSetPlaneMask() | Защита видеопамяти от модифицирования |
Текстовые атрибуты
PgDefaultText() | Сброс текстового атрибута к его системному значению, принимаемому по умолчанию |
PgSetFont() | Установка текстового шрифта |
PgSetTextColor() | Установка цвета текста |
PgSetTextDither() | Установка шаблона сглаживания текста |
PgSetTextTransPat() | Установка прозрачности рисования |
PgSetTextXORColor() | Установка цвета в XOR-прорисовке |
PgSetUnderline() | Установка цветов для подчёркнутого текста |
Атрибуты заполнения
Атрибуты заполнения оказывают влияние на всё рисование, которое Вы выполняете, вызывая функции примитивов, описанных в:
-
Дуги, эллипсы, многоугольники и прямоугольники
-
Текст
-
Побитовые образы
Функциями, устанавливающими атрибуты заполнения, являются:
PgDefaultFill() | Сброс атрибута заполнения в его принимаемое по умолчанию значение |
PgSetFillColor() | Установка точного цвета заполнения |
PgSetFillDither() | Установка конкретного шаблона сглаживания и цветов |
PgSetFillTransPat() | Установка прозрачности рисования |
PgSetFillXORColor() | Установка цвета в XOR-прорисовке |
Атрибуты черты (линии)
Атрибуты черты оказывают влияние на всё рисование, которое Вы выполняете, вызывая функции примитивов, описанных в
-
Дуги, эллипсы, многоугольники и прямоугольники
-
Линии, пиксели и массивы пикселей
-
Текст
-
Побитовые образы
Функциями, устанавливающими атрибуты черты, являются:
PgDefaultStroke() | Сброс атрибута черты в его системное принимаемое по умолчанию значение |
PgSetStrokeCap() | Установка того, как выглядят концы линий |
PgSetStrokeColor() | Установка цвета последующих контуров |
PgSetStrokeDither() | Применение шаблона цвета к контурам |
PgSetStrokeTransPat() | Использование шаблона маски к установке прозрачности рисования контуров |
PgSetStrokeXORColor() | Использование XOR (исключающего ИЛИ) для цвета при рисовании контуров |
PgSetStrokeDash() | Установка пунктирных линий |
PgSetStroJoin() | Установка того, как линии соединяются |
PgSetStrokeWidth() | Установка толщины линии |
PgSetStrokeFWidth() | Установка толщины линии |
Дуги, эллипсы, многоугольники и прямоугольники
Библиотеки Photon'а включают группу функций примитивов, которые Вы можете использовать для рисования кривых, включая:
-
прямоугольники
-
прямоугольники со скруглёнными углами
-
прямоугольники с фасками, прямоугольники и стрелки
-
многоугольники
-
дуги, круги, хорды и сектора
-
спэны (spans) – сложные кривые
Не используйте эти примитивы рисования в интерфейсе, который использует виджеты; виджеты переотображают себя, когда повреждаются, так что всё, нарисованное поверх них, исчезнет. Чтобы отображать кривые, линии и прочая в каком-то интерфейсе:
-
Создайте виджет PtRaw и вызовите примитивы в его функции прорисовки. См. раздел "Виджет PtRaw" выше в этой главе.
или
-
Используйте соответствующий графический виджет. Более полная информация – в описании PtGraphic в "Справочнике виджетов Photon'а".
Пользуясь различными флагами примитива, Вы можете легко нарисовать контур (черта), нарисовать заполнение "внутри" (заполнение), или нарисовать сразу и то и другое как заполненный контур. Использованы атрибуты заполнения и черты. Более подробно см. "Атрибуты рисования" выше в этой главе.
Чтобы: | Установите флаги в: |
Заполнить примитив, используя текущие атрибуты заполнения | Pg_Draw_FILL |
Очертить контур примитива, используя текущие атрибуты черты | Pg_DRAW_STROKE |
Заполнить примитив и очертить его контур, используя текущие атрибуты заполнения и черты | Pg_DRAW_FILL_STROKE |
mx-версии этих функций размещают адрес примитива в буфере рисования пространства данных Вашего приложения. Когда буфер рисования сбрасывается, примитив копируется в графический драйвер. Не-mx-версии копируют в буфер рисования сам примитив.
Прямоугольники
Вы можете рисовать прямоугольники, используя текущие атрибуты рисования, путём вызова функций PgDrawIRect() или PgDrawRect().
Функция PgDrawRect() использует структуру PhRect_t (см. "Справочник библиотечных функций Photon'а" для координат прямоугольника, тогда как PgDrawIRect() позволяет Вам задавать координаты отдельно. Используйте тот метод, который хотите.
В следующем примере рисуется прямоугольник, который заполнен, но не очерчен (т.е. он не имеет контура):
void DrawFillRect( void ) {
PgSetFillColor( Pg_CYAN );
PgDrawIRect( 8, 8, 152, 112, Pg_DRAW_FILL );
}
Если хотите, можете вместо этого использовать функцию PgDrawRect():
void DrawFillRect( void ) {
PhRect_t rect = { {8, 8}, {152, 112} };
PgSetFillColor( Pg_CYAN );
PgDrawRect( &rect, Pg_DRAW_FILL );
}
В следующем примере рисуется оконтуренный незаполненный прямоугольник:
void DrawStrokeRect( void ) {
PgSetStrokeColor( Pg_BLACK );
PgDrawIRect( 8, 8, 152, 112, Pg_DRAW_STROKE );
}
А здесь рисуется оконтуренный заполненный прямоугольник:
void DrawFillStrokeRect( void ) {
PgSetFillColor( Pg_CYAN );
PgSetStrokeColor( Pg_BLACK );
PgDrawIRect( 8, 8, 152, 112, Pg_DRAW_FILL_STROKE );
}
Заполненные и оконтуренные прямоугольники
Прямоугольники со скруглёнными углами
Прямоугольники со скруглёнными углами программируются почти таким же образом, что и прямоугольники – простым вызовом PgDrawRoundRect() с параметром PhPoint_t, указывающим в пикселях скругления углов прямоугольника.
В следующем примере рисуется чёрный скругленный прямоугольник с скруглениями углов в пять пикселей:
void DrawStrokeRoundRect( void ) {
PhRect_t rect = { {20, 20}, {100, 100} };
PhPoint_t radii = { 5, 5 };
PgSetStrokeColor( Pg_BLACK );
PgDrawRoundRect( &rect, &radii, Pg_DRAW_STROKE );
}
Прямоугольники с фасками, прямоугольники и стрелки
Функция PgDrawBevelBox() рисует прямоугольник с фасками, который представляет из себя особый тип прямоугольника:
-
Если Вы устанавливаете Pg_DRAW_FILL или Pg_DRAW_FILL_STROKE в аргументе flags, область прямоугольника с фасками будет заполнена в соответствии с текущими атрибутами заполнения.
-
Если Вы устанавливаете Pg_DRAW_STROKE или Pg_DRAW_FILL_STROKE в flags, верхний и левый края рисуются в соответствии с текущими атрибутами черты, а нижний и правый [в оригинале – left, а не right, что IMHO опечатка – Прим. пер.] края рисуются дополнительным цветом, передаваемым в качестве одного из параметров.
-
Имеется также параметр, позволяющий Вам установить "глубину" фаски.
Этот код рисует тёмно-серый прямоугольник с зелёными и красными фасками шириной в четыре пикселя:
void DrawBevelBox( void ) {
PhRect_t r = { 8, 8, 152, 112 };
PgSetFillColor( Pg_DGREY );
PgSetStrokeColor( Pg_RED );
PgDrawBevelBox( &r, Pg_GREEN, 4, Pg_DRAW_FILL_STROKE );
}
Прямоугольник с фасками
Вы можете вызвать функцию PgDrawBeveled(), чтобы нарисовать прямоугольник с фасками (как возможность – со срезанными или скруглёнными углами) или стрелку с фасками. Если Вы рисуете прямоугольник с прямыми углами, результат будет тем же, что и в случае PgDrawBevelBox(). Вот код, рисующий прямоугольники со срезанными и скруглёнными углами и набор стрелок:
void DrawBeveled() {
PhRect_t clipped_rect = { {10, 10}, {150, 62} };
PhRect_t rounded_rect = { {10, 67}, {150, 119} };
PhPoint_t clipping = { 8, 8 };
PhPoint_t rounding = { 12, 12 };
PhRect_t rup = { {190, 20}, {230, 40} };
PhRect_t rdown = { {190, 90}, {230, 110} };
PhRect_t rleft = { {165, 45}, {185, 85} };
PhRect_t rright = { {235, 45}, {255, 85} };
/* Рисуются прямоугольники с фасками: один со срезанными,
другой со скруглёнными углами. */
PgSetFillColor( Pg_GREEN );
PgSetStrokeColor( Pg_GREY );
PgDrawBeveled( &clipped_rect, &clipping, Pg_BLACK, 2,
Pg_DRAW_FILL_STROKE | Pg_BEVEL_CLIP );
PgDrawBeveled( &rounded_rect, &rounding, Pg_BLACK, 2,
Pg_DRAW_FILL_STROKE | Pg_BEVEL_ROUND );
/* Рисуются стрелки с фасками. */
PgSetFillColor( Pg_CYAN );
PgSetStrokeColor( Pg_GREY );
PgDrawBeveled( &rup, NULL, Pg_BLACK, 2,
Pg_DRAW_FILL_STROKE | Pg_BEVEL_AUP );
PgDrawBeveled( &rdown, NULL, Pg_BLACK, 2,
Pg_DRAW_FILL_STROKE | Pg_BEVEL_ADOWN );
PgDrawBeveled( &rleft, NULL, Pg_BLACK, 2,
Pg_DRAW_FILL_STROKE | Pg_BEVEL_ALEFT );
PgDrawBeveled( &rright, NULL, Pg_BLACK, 2,
Pg_DRAW_FILL_STROKE | Pg_BEVEL_ARIGHT );
}
Прямоугольники и стрелки с фасками
Если Вы хотите рисовать стрелку, встроенную в заданный прямоугольник (например, стрелку линейки протяжки), используйте функцию PgDrawArrow().
Многоугольники
Вы можете создать многоугольники, задаваемого массива точек PhPoint_t. Если Вы используете Pg_CLOSED как часть аргумента flags, последняя точка автоматически соединяется с первой, замыкая многоугольник. Вы можете также задавать точки относительно начальной – первой точки (используя Pg_POLY_RELATIVE).
Следующий пример рисует синий шестиугольник с белым контуром:
void DrawFillStrokePoly( void ) {