AppBuilder (1037668), страница 5
Текст из файла (страница 5)
PtSetResource( ApGetWidgetPtr( ApGetInstance( widget ),
ABN color rect ), Pt ARG 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;
/* eliminate ’unreferenced’ warnings */
widget = widget, apinfo = apinfo, cbinfo = cbinfo;
/* Get a pointer to the current window. */
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 установке, чтобы обновить предыдущее окно до текущего окна, если оно не было закрыто. Определите, какое окно было установлено до этого окна.
*/
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 );
}
Изменение функции закрытия окна
Наконец Вы должны изменить функцию newwin_close() так, чтобы она установила NULL массиву указателей win для экземпляра окна, когда оно закрыто. Таким образом, Вы можете проверить на NULL массив указателей win, чтобы определить, существует ли еще окно.
Изменим файл newwin close.c следующим образом:
extern int win ctr;
extern PtWidget t *win[5];
int
newwin close( PtWidget t *widget, ApInfo t *apinfo,
PtCallbackInfo t *cbinfo )
{
PhWindowEvent t *we = cbinfo->cbdata;
int i;
/* eliminate ’unreferenced’ warnings */
apinfo = apinfo;
/* only process WM close events */
if ( we->event f != Ph WM CLOSE ) {
return( Pt CONTINUE );
}
/* okay it’s a close so who is it? */
for ( i = 0; i < win ctr; i++ ) {
if ( win[i] == widget ) {
win[i] = NULL;
break;
}
}
return( Pt CONTINUE );
}
Компилирование и выполнение
1. Строим и выполняем приложение.
2. Из меню приложения File, выберите New несколько раз, чтобы создать множественные окна. Вы будете видеть относительный номер каждого окна в его заголовке.
3. Нажимаем цветовую кнопку, чтобы изменить цвет прямоугольника. Тогда нажмите кнопку Change Previous Window Color в любом окне, чтобы изменить цвет фона предыдущего окна.