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

Создание подменю

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

  1. Создать кнопку меню для каскадного меню, установив Pt_ARG_BUTTON_TYPE в Pt_MENU_RIGHT или Pt_MENU_DOWN, как потребуется.

  2. Сохранить указатель на текущий родительский виджет, вызвав функцию Pt_GetParent():

menu=PtGetParentWidget();

  1. Создать новый виджет PtMenu и установить Pt_MENU_CHILD в ресурсе нового меню Pt_ARG_MENU_FLAGS.

 PtMenu является контейнером, так что это новое меню становится текущим принятым по умолчанию родителем.

  1. Создать пункты подменю, как описано выше.

  2. Восстановить принимаемого по умолчанию родителя из сохранённого значения, вызвав PtSetParentWidget():

PtSetParentWidget(menu);

  1. Продолжить добавление пунктов в верхнем меню, если требуется.

Этот пример показывает, как генерировать подменю, а также как client_data могут быть использованы для ответных реакций класса для идентификации пункта, выбранного из меню:

/* Меню с подменю */

/* Стандартные хеадеры */

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

/* Инструментальные хеадеры */

#include <Ph.h>

#include <Pt.h>

#include <Ap.h>

/* Локальные хеадеры */

#include "abimport.h"

#include "proto.h"

/* Константы для форм в меню */

#define RECTANGLE 1

#define CIRCLE 2

#define DOT 3

#define BLOB 4

#define POLYGON 5

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

{

int shape_chosen = (int) client_data;

widget=widget, client_data=client_data, cbinfo=cbinfo;

/* Эта ответная реакция использует клиентские данные, чтобы */

/* определить, какая форма была выбрана */

switch (shape_chosen) {

case RECTANGLE: ...

break;

case CIRCLE : ...

break;

case DOT : ...

break;

case BLOB : ...

break;

case POLYGON : ...

break;

default : printf ("Неизвестная форма: %d\n", shape_chosen);

}

return (Pt_CONTINUE);

}

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

{

PtArg_t args[3];

PtWidget_t *menu, *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, ShapeMenuCB, (void *) RECTANGLE );

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

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

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

PtAddCallback ( new_item, Pt_CB_ACTIVATE, ShapeMenuCB, (void *) CIRCLE );

/* Создание кнопки меню для подменю */

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

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

PtSetArg (&args[2], Pt_ARG_BUTTON_TYPE, Pt_MENU_RIGHT, 0 );

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

/* Сохранение текущего принятого по умолчанию родителя */

menu = PtGetParentWidget();

/* Создание подменю. Оно становится новым принимаемым по умолчанию родителем */

PtSetArg (&args[0], Pt_ARG_MENU_FLAGS, Pt_MENU_CHILD, Pt_MENU_CHILD);

new_item = PtCreateWidget( PtMenu, Pt_DEFAULT_PARENT, 1, args);

/* Добавление пунктов в подменю */

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

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

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

PtAddCallback ( new_item, Pt_CB_ACTIVATE, ShapeMenuCB, (void *) DOT );

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

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

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

PtAddCallback ( new_item, Pt_CB_ACTIVATE, ShapeMenuCB, (void *) BLOB);

/* Восстановление текущего принятого по умолчанию родителя */

PtSetParentWidget (menu);

/* Продолжение добавления пунктов в верхнее меню */

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

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

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

PtAddCallback ( new_item, Pt_CB_ACTIVATE, ShapeMenuCB, (void *) POLYGON);

return( Pt_CONTINUE );

}

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