logo search
Литература_1 / photon_old

Стили виджетов

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

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

Каждый экземпляр виджета может ссылаться на определённый стиль, обеспечиваемый его классом. Вы можете изменить стиль, которым какой-либо виджет сможет воспользоваться в любой момент, когда это Вам понадобится.

Каждый стиль имеет набор членов, включающих имя стиля и функции, которые заменяют или расширяют какие-либо методы класса виджета. Методы являются функциями уровня класса, определяющими, как виджет инициализирует себя, прорисовывает себя, вычисляет свои размеры и прочая. Для получения более полной информации о методах см. руководство "Построение подстраиваемых виджетов". Члены стиля определены следующими декларациями:

Pt_STYLE_DRAW Адрес функции, вызываемой всякий раз виджетом, использующим этот стиль, когда ему требуется перерисовать себя.

Pt_STYLE_EXTENT или Pt_STYLE_SIZING Адрес функции, вызываемой всякий раз виджетом, использующим этот стиль, когда происходит перемещение, изменение размеров или модификация такого рода, которая может потребовать перемещения виджета или изменения его размеров (изменение в данных виджета). Эта функция отвечает за установку размеров виджета в соответствующие значения.

Pt_STYLE_ACTIVATE Адрес функции, вызываемой всякий раз виджетом, создаваемым со стилем, принятым по умолчанию, и всякий раз, когда стиль виджета изменяется с одного стили на другой. Эта функция является тем местом, где размещается манипулирование плоскостями управления виджета, дополнения к ответным реакциям или установки ресурсов (для перезаписи принятых для виджета по умолчанию).

Pt_STYLE_CALC_BORDER Адрес функции, отвечающей за оповещение как много пространства требуется для представления отделки и границ краёв виджета.

Pt_STYLE_CALC_OPAQUE Адрес функции, отвечающей за вычисление списка

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

Pt_STYLE_DEACTIVATE Адрес функции, вызываемой всякий раз виджетом,

использующим этот стиль, когда виджет уничтожается либо переключается на другой стиль.

Pt_STYLE_NAME Имя стиля

Pt_STYLE_DATA Указатель на произвольный блок данных для использования стилем.

Более детально описание этих членов см. в описании библиотечной функции Photon'a PtSetStyleMembor().

Следующие функции позволяют Вам создавать и манипулировать стилями класса виджета:

PtAddClassStyle()

Добавляет стиль к классу виджета

PtCreateClassStyle()

Создаёт стиль класса

PtDupClassStyle()

Получает копию стиля класса виджета

PtFindClassStyle()

Отыскивает стиль с заданным именем

PtGetStyleMember()

Получает член стиля

PtGetWidgetStyle()

Получает стиль, который виджет использует в текущий момент

PtSetStyleMember()

Устанавливает член стиля

PtSetStyleMembers()

Устанавливает множество членов стиля из списка аргументов переменной длины

PtSetWidgetStyle()

Устанавливает текущий стиль для виджета

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

 Вы можете также установить стиль экземпляра виджета, установив его ресурс Pt_ARG_STYLE (см. описание виджета PtBasic в книге "Справочник виджетов"). Установка этого ресурса имеет тот же эффект, что и вызов функции PtSetWidgetStyle().

Этот пример создаёт стиль, названный blue, и несколько кнопок. Заметьте, что Ваши виджеты могут использовать стиль до того, как Вы добавили стиль к классу или даже перед тем, как Вы создали стиль. Когда Вы создаёте стиль и добавляете его, все виджеты, использующие стиль, немедленно обновляются.

#include <Pt.h>

PtWidget_t *win, *but;

PtWidgetClassStyle_t *b;

void blue_draw (PtWidget_t *widget, PhTile_t *damage)

{

/* Это функция прорисовки для стиля blue.

Она рисует голубой прямоугольник (без надписи)

для виджета.

*/

PgSetFillColor( Pg_BLUE);

PgDrawRect( PtWidgetExtent (widget,NULL), Pg_DRAW_FILL);

}

int use_blue_style( PtWidget_t *widget, void *data, PtCallbackInfo_t *cbinfo)

{

/* Эта ответная реакция устанавливает текущий стиль для данного

экземпляра виджета. Если Вы не прикрепили стиль blue

к классу, никаких изменений во внешнем виде виджета нет.

*/

PtSetWidgetStyle (widget, "blue");

return Pt_CONTINUE;

}

int attach_blue_style( PtWidget_t *widget, void *data,

PtCallbackInfo_t *cbinfo)

{

/* Эта ответная реакция добавляет стиль к классу виджета.

Если Вы щёлкнули на одной из кнопок "использование стиля blue",

изменится стильвсех кнопок.

*/

PtAddClassStyle (PtButton, b);

return Pt_CONTINUE;

}

int main()

{

PhArea_t area = {{0,50},{100,100}};

PtArg_t argt[10];

PtStyleMethods_t meth;

PtCallback_t cb = {use_blue_style, NULL};

PtCallback_t cb2 = {attach_blue_style, NULL};

int unsigned n;

/* Инициализация методов для стиля. */

meth.method_index = Pt_STYLE_DRAW;

meth.func = blue_draw;

PtInit(NULL);

/* Создание окна. */

PtSetArg (&argt[0], Pt_ARG_DIM, &area.size, 0);

win = PtCreateWidget (PtWindow, NULL, 1, argt);

/* Создание нескольких кнопок. Когда Вы щёлкаете по одной из этих

кнопок, ответная реакция делает экземпляр виджета

использующим стиль blue. */

n = 0;

PtSetArg (&argt[n++], Pt_ARG_TEXT_STRING, "Use blue style", 0);

PtSetArg (&argt[n++], Pt_CB_ACTIVATE, &cb, 1);

but = PtCreateWidget (PtButton, NULL, n, argt);

PtSetArg (&argt[0], Pt_ARG_TEXT_STRING, "Use blue style also", 0);

PtSetArg (&argt[n++], Pt_ARG_POS, &area.pos, 0);

but = PtCreateWidget (PtButton, NULL, n, argt);

/* Создание другой кнопки. Когда Вы щёлкаете на ней,

ответная реакция прикрепляет стиль blue к классу виджета. */

n = 0;

PtSetArg (&argt[n++], Pt_ARG_TEXT_STRING, "Attach blue style", 0);

PtSetArg (&argt[n++], Pt_CB_ACTIVATE, &cb2, 1);

PtSetArg (&argt[n++], Pt_ARG_POS, &area.pos, 0);

area.pos.y = 85;

but = PtCreateWidget (PtButton, NULL, n, argt);

/* Копирование принимаемого по умолчанию стиля, чтобы создать стиль blue.

Замена рисуемого члена новым стилем. */

b = PtDupClassStyle (PtButton, NULL, "blue");

PtSetClassStyleMethods (b,1,&meth);

PtRealizeWidget (win);

PtMainLoop();

return EXIT_SUCCESS;

}