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

Генерирование пунктов меню

Иногда Вам может потребоваться генерировать пункты меню в ходе выполнения задачи. Например, меню "Window" PhAB'а включает список модулей в Вашем приложении. Чтобы сгенерировать пункты меню, добавьте пункт-функцию в Ваш модуль меню (как описано в разделе "Создание пунктов-функций" в главе "Работа с модулями") и отредактируйте сгенерированную PhAB'ом заготовку функции.

Например, если Ваш модуль draw_menu включает пункт-функцию, который вызывает функцию add_shapes(), PhAB сгенерирует следующий код:

int add_shapes (PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo)

{

/* предотвращает предупреждения (варнинги) об отсутствии ссылок */

widget=widget, apinfo=apinfo, cbinfo=cbinfo;

return (Pt_CONTINUE);

}

Параметры, переданные этой функции, не используются. Мы используем функцию PtCreateWidget(), чтобы создать пункты меню, которые обычно являются виджетами PtMenuButton. Как описано в главе "Манипулирование ресурсами в программном коде приложения", чтобы установить начальные значения для ресурсов, мы можем использовать тот же тип списка аргументов, который мы использовали с функцией PtSetResourses(). Например, чтобы добавить пункт "Rectangle" с клавишей быстрого доступа "R":

PtArg_t args[2];

PtWidget_t *new_item;

PtSetArg (&args[0], Pt_ARG_TEXT_STRING, "Rectangle", 0);

PtSetArg (&args[1], Pt_ARG_ACCEL_KEY, "R", 0);

new_item = PtCreateWidget( PtMenuButton, Pt_DEFAULT_PARENT, 2, args);

Вторым параметом в вызове PtCreateWidget() является родитель виджета; когда Вы генерируете пункты меню, он должен быть установлен в Pt_DEFAULT_PARENT. Это делает новый пункт потомком текущего меню или подменю. Не вызывайте в этом случае функцию PtSetParentWindget(). Далее, мы хотим прикрепить к новому пункту функцию ответной реакции. Мы должны сделать это вручную; PhAB не создаёт для этого заготовку функции. Например, ответная реакция для нашего нового пункта может быть такой:

int rect_callback ( PtWidget_t *widget, void *client_data, PtCallbackInfo_t *cbinfo)

{

.......

}

Эта ответная реакция похожа на код ответной реакции, генерируемой PhAB. Её аргументами являются:

widget Указатель на выбранный пункт меню

client_data Произвольные данные, передаваемые ответной реакции.

 Это отличается от кода ответной реакции PhAB, которой в качестве второго аргумента передаётся apinfo.

cbinfo Указатель на общую структуру ответной реакции Photon'а. Структура предоставляет информацию, относящуюся к виджету, вызвавшему ответную реакцию, событие Photon'а и некоторые данные по ответной реакции, специфические для виджета. Формат данных зависит от класса виджета и типа ответной реакции. Для получения более полной информации см. описание PtCallbackInfo_t в "Справочнике виджетов".

Последнее, что нам надо сделать – это добавить ответную реакцию в список ответных реакций пункта меню Pt_CB_ACTIVATE, используя функцию PtAddCallback():

PtAddCallback(new_item, Pt_CB_ACTIVATE, rect_callback, NULL);

Последний аргумент в вызове функции PtAddCallback() задаёт то, что будет передано как аргумент client_data ответной реакции. Для получения более полной информации см. раздел "Ответные реакции" в главе "Управление виджетами в программном коде приложения".

Давайте сведём всё это вместе:

int rect_callback( PtWidget_t *widget, void *client_data, PtCallbackInfo_t *cbinfo)

{

...

}

int

add_shapes (PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo)

{

PtArg_t args[2];

PtWidget_t *new_item;

/* предотвращает предупреждения (варнинги) об отсутствии ссылок */

widget=widget, apinfo-apinfo, cbinfo=cbinfo;

PtSetArg (&args[0], Pt_ARG_TEXT_STRING, "Rectangle", 0);

PtSetArg (&args[1], Pt_ARG_ACCEL_KEY, "R", 0);

new_item = PtCreateWidget( PtMenuButton, Pt_DEFAULT_PARENT, 2, args);

PtAddCallback (new_item, Pt_CB_ACTIVATE, rect_callback, NULL);

/* Повторить всё вышеприведенное для других форм */

return (Pt_CONTINUE);

}

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