Руководство программиста в 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 ) {















