Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
76
Добавлен:
02.04.2015
Размер:
8.79 Mб
Скачать
      1. Функция необработанного рисования

Когда Вы создаёте виджет PtRaw в PhAB'е и приметесь редактировать его функцию Pt_ARG_RAW_DRAW_F, Вы увидите предлагаемый по умолчанию код такого вида:

void my_raw_draw_fn( PtWidget_t *widget, PhTile_t *damage ) {

PtSuperClassDraw( PtBasic, widget, damage );

}

Вызов функции PtSuperClassDraw() (описанный в "Руководстве по созданию своих собственных виджетов") вызывает функцию рисования PtBasic'а, которая рисует границы необработанного виджета, заполняет виджет, и всё прочее, как задано его ресурсами. Необработанный виджет может делать всё это самостоятельно, но использование функции PtSuperClassDraw() снижает сложность функции необработанного рисования.

При обсуждении функции необработанного рисования следует отметить несколько вопросов:

  • Вам необходимо знать холст (canvas) необработанного виджета.

  • Начало рисуемых примитивов находится в левом верхнем углу холста родителя необработанного виджета, а не самого необработанного виджета. Вам необходимо выполнить преобразование координат.

  • Необработанный виджет можно рисовать вне своего холста, но это нельзя назвать хорошей идеей. Вы должны установить в функции рисования отсечение.

  • Функции прорисовки передаётся список повреждённых областей, что может использоваться для увеличения скорости восстановления.

  • Для необработанных виджетов, содержание которых изменяется динамически, Вы можете определить модель, описывающую, что прорисовать. Всё это обсуждается ниже, и следом несколько примеров простых функций прорисовки.

 Не вызывайте функцию PtBkgdHandlerProcess() в функции рисования виджета PtRaw.

Не изменяйте каким бы то ни было способом (создавая, разрушая, устанавливая ресурсы и прочая) какие бы то ни было другие виджеты в функции прорисовки необработанного виджета. Получение ресурсов из других виджетов является безопасным. Не вызывайте функцию прорисовки непосредственно из своей программы. Вместо этого повредите виджет, вызвав функцию PtDamageWidget(), и позвольте библиотеке вызвать функцию прорисовки.

      1. Определение холста необработанного виджета

Вы можете определить холст необработанного виджета, вызвав функцию PtCalcCanvas() следующим образом:

PhRect_t raw_canvas;

PtCalcCanvas(widget, &raw_canvas);

Вам понадобится это холст при выполнении каких-либо требующихся преобразований и обрезаний.

      1. Преобразование координат

Начальной точкой для рисования примитивов является верхний левый угол холста родителя необработанного виджета. Вам, вероятно, покажется более удобным использование в качестве начальной точки верхнего левого угла холста самого необработанного виджета.

После того, как Вы определили холст необработанного виджета, Вы можете выполнить одно из следующего:

  • Добавлять координаты верхнего левого угла холста необработанного виджета ко всем координатам, передаваемым в примитивы рисования. Например, чтобы нарисовать эллипс с центром в координатах (80, 60) относительно холста необработанного виджета, необходимо сделать так:

PhPoint_t c1 = { 80, 60 };

PhPoint_t r = { 72, 52 };

c1.x += raw_canvas.ul.x;

c1.y += raw_canvas.ul.y;

PgSetFillColor(Pg_YELLOW);

PgDrawEllipse ( &c1, &r, Pg_DRAW_FILL );

Этот метод предпочтительный.

  • Вы можете установить преобразование, вызвав функцию PgSetTranslation() и передав ей координаты верхнего левого угла холста необработанного виджета:

PhPoint_t c1 = { 80, 60 };

PhPoint_t r = { 72, 52 };

PgSetTranslation (&raw_canvas.ul, Pg_RELATIVE);

PgSetFillColor(Pg_YELLOW);

PgDrawEllipse ( &c1, &r, Pg_DRAW_FILL );

 Убедитесь, что Вы восстановили старое преобразование, перед тем как выйти из функции рисования необработанного виджета. Вот один из способов, как это сделать:

/* Восстановление преобразования извлечением координат холста необработанного виджета */

raw_canvas.ul.x *= -1;

raw_canvas.ul.y *= -1;

PgSetTranslation (&raw_canvas.ul, Pg_RELATIVE);

Соседние файлы в папке Литература_1