Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПОУК / 09 семестр / Книги и методические указания / Руководство программиста в Photon.doc
Источник:
Скачиваний:
364
Добавлен:
04.03.2014
Размер:
7.99 Mб
Скачать

Генерирование и модификация кода

На последнем уроке Вы использовали сгенерированную декларацию ABW_xxx, чтобы получить доступ к указателю на экземпляр диалога. При работе с множественными экземплярами модуля окна Вы не можете использовать эту декларацию, поскольку она ссылается только на последнее созданное окно. Вместо этого Вы добавляете код к сгенерированной функции установки окна, так чтобы она хранила копию каждого указателя на экземпляр окна в глобальном массиве виджетов. На этом уроке Вам понадобятся эти указатели для работы кнопки "Change Previous Window Color".

Генерирование кода

Откройте диалог "Build+Run" и перегенерируйте код.

Модификация функции установки

Теперь давайте модифицируем функцию newwin_setup(), так чтобы она :

  • ограничивала число возможных экземпляров пятью;

  • хранила копии каждого указателя на окно;

  • отображала номер экземпляра окна на панели заголовка этого окна.

Отредактируйте файл newwin_setup.с, как показано ниже:

int win_ctr = 0;

PtWidget_t *win[5];

int

newwin_setup( PtWidget_t *link_instance,

ApInfo_t *apinfo,

PtCallbackInfo_t *cbinfo )

{

char buffer[40];

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

link_instance = link_instance, apinfo = apinfo, cbinfo = cbinfo;

/* Заметьте: Возвращение Pt_END в предреализационной функции установки

указывает PhAB удалять модуль без его реализации */

/* позволяет только 5 окон максимум */

if ( win_ctr == 5 ) {

return( Pt_END );

}

/* сохранение указателя на экземпляр модуля окна */

win[win_ctr] = link_instance;

sprintf( buffer, "Window %d", win_ctr + 1 );

PtSetResource( win[win_ctr], Pt_ARG_WINDOW_TITLE,

buffer, 0 );

win_ctr++;

return( Pt_CONTINUE );

}

Модификация функции изменения цвета

Теперь давайте модифицируем функцию color_change(), так чтобы :

  • нажатие кнопки "Red", "Green" или "Blue" изменяло цвет прямоугольника в цвет кнопки;

  • нажатие на кнопку "Change Previsious Window Color" изменяло фон предыдущего окна на цвет из массива.

 Если бы это был модуль диалога, Вы бы могли использовать декларацию ABW_color_rect, чтобы обновить цвет прямоугольника. Однако, поскольку это модули окон, Вы должны использовать указатель на экземпляр окна, в котором нажата кнопка.

Чтобы получить указатель на экземпляр виджета текущего окна, Вам необходимо вызвать:

  1. ApGetInstance() для получения указателя на окно, содержащее виджет, вызвавший ответную реакцию

  2. ApGetWidgetPtr() для получения указателя на виджет с данной декларацией ABN_...

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

PtSetResource (ABW_color_rect, Pt_APG_FILL_COLOR, buffer, 0);

Но в рассматриваемом случае color_change должно использовать:

PtSetResourse (ApGetWingetPtr (ApGetInstance (winget), ABN_color_rect),

Pt_APG_FILL_COLOR, buffer, 0);

Поэтому Вам необходимо изменить color_change.c таким образом:

PgColor_t colors[5] = {Pg_BLACK, Pg_YELLOW, Pg_MAGENTA,

Pg_CYAN, Pg_DGREEN};

int base_clr = -1;

extern int win_ctr;

extern PtWidget_t *win[5];

int

color_change( PtWidget_t *widget, ApInfo_t *apinfo,

PtCallbackInfo_t *cbinfo )

{

int i, prev;

PtWidget_t *this_window;

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

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

/* Получает указатель на текущее окно */

this_window = ApGetInstance( widget );

if ( ApName( widget ) == ABN_btn_red ) {

PtSetResource(

ApGetWidgetPtr( this_window, ABN_color_rect ),

Pt_ARG_FILL_COLOR, Pg_RED, 0 );

} else if ( ApName( widget ) == ABN_btn_green ) {

PtSetResource(

ApGetWidgetPtr( this_window, ABN_color_rect ),

Pt_ARG_FILL_COLOR, Pg_GREEN, 0 );

} else if ( ApName( widget ) == ABN_btn_blue ) {

PtSetResource(

ApGetWidgetPtr( this_window, ABN_color_rect ),

Pt_ARG_FILL_COLOR, Pg_BLUE, 0 );

} else if ( ApName( widget ) == ABN_btn_prev ) {

/* Заметьте: Здесь мы используем указатели на экземпляры модулей окон, сохранённые в newwin_setup, чтобы обновить предыдущее окно до текущего в случае, когда оно не закрыто.

Определяется, какое окно является предыдущим по отношению к этому окну */

prev = -1;

for ( i = 0; i < win_ctr; i++ ) {

if ( win[i] == this_window ) {

prev = i - 1;

break;

}

}

/* Если окно по прежнему существует, обновляет его цвет фона. */

if ( prev != -1 && win[prev] ) {

base_clr++;

if (base_clr >= 5) {

base_clr = 0;

}

PtSetResource( win[prev], Pt_ARG_FILL_COLOR,

colors[base_clr], 0 );

}

}

return( Pt_CONTINUE );

}