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

Давайте теперь посмотрим несколько примеров того, как Вы можете использовать глобальное имя и декларацию виджета из программного кода приложения. Во-первых, вот пример использования глобальной переменной ABN_done и функции ApName() для проверки конкретного виджета в ответной реакции:

int mycallback(PtWidget_t * widget, ...) {

/* проверка конкретного виджета */

if (ApName(widget) = = ABN_done) {

/* выполнение обработки кнопки */

}

return(Pt_CONTINUE);

}

Следующий пример использует ABW_done, чтобы изменить цвет фона виджета done на красный (для получения более полной информации см. главу "Управление ресурсами в программном коде приложения"):

int mycallback(PtWidget_t * widget,...) {

PtSetResource(ABW_done, Pt_ARG_FILL_COLOR, Pg_RED, 0);

return(Pt_CONTINUE);

}

 Помните, что глобальная переменная и декларация виджета будут иметь силу только после того, как виджет будет создан, и до тех пор, пока не будет уничтожен.

          1. Обработка множества экземпляров окна

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

Пусть, скажем, Вы имеете следующий модуль окна:

              1. Рис. 9-1. Простое окно поиска

Примем, что имена экземпляров следующие:

  • search_win для окна

  • name_txt для текстовой области

  • search_btn для кнопки

Если у Вас на экране одновременно имеется два экземпляра окна и пользователь щёлкнул на кнопке "Search", как Вы получите значение в текстовом виджете "Name"? Поскольку имеются два экземпляра окна, существует и два экземпляра текстового виджета. ABW_name_txt указывает на последний созданный экземпляр текстового виджета.

Решение основано на том факте, что для ссылки на оба экземпляра виджета name_txt может использоваться ABN_name_txt, обеспечивающий Вас указателем на виджет в том окне, которое содержит нужный текстовый виджет. Это осуществляется использованием функции ApGetWidgetPtr():

PtWidget_t *window_wgt, *text_wgt;

text_wgt = ApGetWidgetPtr(window_wgt, ABN_name_txt);

Где Вы получите window_wgt? В вышеприведенном случае Вы имеете ответную реакцию кодового типа на кнопке "Search". Первым параметром, передаваемым кодовой ответной реакции, является указатель на виджет кнопки "Search". Для получения указателя на окно, содержащее кнопку "Search", Вы можете использовать функцию ApGetInstance(). Таким образом ответная реакция станет такой:

int search_callback(PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo) {

char *name;

PtWidget_t *window_wgt, *txt_wgt;

/* Получение окна, в котором находится кнопка"Search" */

window_wgt = ApGetInstance(widget);

/* В данном окне ищем текстовый виджет */

text_wgt = ApGetWidgetPtr(window_wgt, ABN_name_txt);

/* Теперь получим текст */

PtGetResource(text_wgt, Pt_ARG_TEXT_STRING, &name, 0);

/* Переменная 'name' теперь указывает на корректный текст. */

/* Обработка текста соответствующим образом */

...

return(Pt_CONTINUE);

}

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