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

Размещение пользовательских данных вместе с поверхностями управления

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

PtSurfaceAddData(), PtSurfaceAddDataById()

Добавляет данные к поверхности управления

PtSurfaceGetData(), PtSurfaceGetDataById()

Получает данные, связанные с поверхностью управления

PtSurfaceRemoveData(), PtSurfaceremoveDataById()

Удаляет данные из поверхности управления

      1. Пример

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

#include <Pt.h>

/* Это функция, вызываемая, когда для нашей прямоугольной поверхности

управления происходит событие. Когда пользователь щёлкает

на этой поверхности, мы подсчитаем итог и напечатаем, сколько раз это приключилось. */

static int rect_surface_callback( PtWidget_t *widget, PtSurface_t *surface, PhEvent_t *event) {

static int rclicks = 1;

printf("Щелчков по прямоугольнику: %d\n", rclicks++);

return(Pt_END);

}

/* Эта функция, рисующая содержание нашей прямоугольной поверхности

управления. Это очень простой пример; он рисует красный прямоугольник. */

static void rect_surface_draw( PtWidget_t *widget, PtSurface_t *surface, PhTile_t *damage) {

PgSetFillColor(Pg_RED);

PgDrawRect(PtSurfaceRect(surface, NULL), Pg_DRAW_FILL);

}

/* Это функция, синхронизирующая размер поверхности управления с размером виджета.

PtWidgetExtent() возвращает прямоугольник, охватывающий текущий размер виджета.

PtSurfaceRect() является макросом; это означает, что Вы имеете прямой доступ к данным

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

чтобы изменить её размер. Изменяйте напрямую данные. */

static void rect_surface_calc( PtWidget_t *widget, PtSurface_t *surface, uint8_t post) {

/* Делать это только после того, как виджет расширится. */

if (post) {

/* Прямоугольник занимает верхний левый квадрант окна. */

PhRect_t *extent;

PhRect_t *srect;

extent = PtWidgetExtent(widget, NULL);

srect = PtSurfaceRect(surface, NULL);

srect->ul = extent->ul;

srect->lr.x = (extent->ul.x + extent->lr.x) / 2;

srect->lr.y = (extent->ul.y + extent->lr.y) / 2;

}}

/* Это функция, вызываемая, когда случается событие для нашей эллиптической

поверхности управления. Когда пользователь щёлкает на этой поверхности, мы

подсчитаем итог и напечатаем, сколько раз это приключилось. */

static int ell_surface_callback( PtWidget_t *widget, PtSurface_t *surface, PhEvent_t *event) {

static int eclicks = 1;

printf("Ellipse clicks: %d\n", eclicks++);

return(Pt_END);

}

/* Эта функция, рисующая содержание нашей эллиптической поверхности

управления. Это очень простой пример; он рисует зелёный эллипс. */

static void ell_surface_draw( PtWidget_t *widget, PtSurface_t *surface, PhTile_t *damage) {

PhRect_t *s = PtSurfaceRect(surface, NULL);

PgSetFillColor(Pg_GREEN);

PgDrawEllipse(&(s->ul), &(s->lr), Pg_DRAW_FILL | Pg_EXTENT_BASED);

}

/* Это наша main-функция. Мы создаём окно, инициализируем наше приложение

с сервером Photon и создаём две поверхности управления.

Заметьте, что вторая поверхность не обеспечивает последний параметр, функцию

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

высота и ширина хранятся в указываемой структуре. Это указатель на реальную

указываемую структуру внутри виджета окна. Поэтому, если объём окна изменился,

изменяя структуру указания пространства, поверхность управления обновляет свои

значения автоматически! */

int main(int argc, char **argv) {

PtArg_t args[1];

PtWidget_t *window;

const PhDim_t dim = { 200, 200 };

PtSetArg(&args[0], Pt_ARG_DIM, &dim, 0);

window = PtAppInit(NULL, &argc, argv, 1, args);

/* Создание прямоугольной поверхности управления. */

PtCreateSurface( window, 0, 0, Pt_SURFACE_RECT, NULL, Ph_EV_BUT_PRESS,

rect_surface_callback, rect_surface_draw, rect_surface_calc);

/* Создание эллиптической поверхности управления для заполнения окна. */

PtCreateSurface( window, 0, 0, Pt_SURFACE_ELLIPSE,

(PhPoint_t*)PtWidgetExtent(window, NULL),

Ph_EV_BUT_PRESS, ell_surface_callback, ell_surface_draw, NULL);

PtRealizeWidget(window);

PtMainLoop();

return(EXIT_SUCCESS);

}

Yandex.RTB R-A-252273-3
Yandex.RTB R-A-252273-4