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

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

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

 Если бы это был модуль диалога, Вы бы могли использовать декларацию 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 );

}

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