AppBuilder (1037668), страница 4
Текст из файла (страница 4)
.
6. Выбираем виджет PtButton и изменяем его ресурс текста кнопки на Done. Тогда измените его имя образца на about_done.
7. Выравняем по центру виджеты горизонтально в диалоге. Выберем PtLabel виджет и PtButton виджет, выберите Align из меню Widget, и затем выберите Alignment Tool из подменю. Вы будете видеть диалог выравнивания Виджетов:
8. В столбце Horizontal, нажмите Align Centers, и на Align to Container. Потом нажмите кнопку Align. Две метки и кнопка должны теперь должны быть центрированы горизонтально в пределах вашего диалога. Ваш aboutdlg модуль должен теперь выглядеть следующим образом
Добавление callback вызова к кнопке Done
Теперь давайте добавлять callback вызов к кнопке Done так, чтобы диалог закрылся, когда пользователь нажимает на кнопку.
1. Выбирают кнопку Done, затем переключают к панели управления callback вызовов.
2. Щелкнем Activate, чтобы добавить активизирующийся callback вызов. Вы увидите редактор callback вызова.
3. Выбираем Done тип кода, затем нажимают Apply. Не введите ничто в поле Function. Выбор Done типа кода говорит виджету исполнять операцию “Done”, когда виджет активизирован. То есть виджет вызывает функцию указанной в поле Function (если определены) и затем закрываете модуль диалога.
4. Закрываем редактор. Список callback вызовов теперь указывает, что Вы добавили активизирующийся callback вызов по имени Done:
Модификация сгенерированного кода функции
Теперь необходимо изменить сгенерированную функцию aboutdlg setup() так, чтобы она изменяла метку about version, чтобы показать номер версии.
1. Выберем Build>Generate UI. Это сохраняет ваше приложение, и генерирует необходимые файлы.
2. Когда генерация объектного кода закончена, выберем Window>Show Project чтобы принести
окно Browse Files на передний план. Выберите aboutdlg setup.c в списке файлов, и нажмите Edit, или дважды щелкните имя файла. Если Вы используете PhAB из интегрированной среды разработки, Вы можете открыть и редактировать этот файл в интегрированной среде разработки.
Измените код :
int
aboutdlg setup( PtWidget t *link instance,
ApInfo t *apinfo,
PtCallbackInfo t *cbinfo )
{
/* eliminate ’unreferenced’ warnings */
link instance = link instance,
apinfo = apinfo,
cbinfo = cbinfo;
return( Pt CONTINUE );
}
На следующий:
int
aboutdlg setup( PtWidget t *link instance,
ApInfo t *apinfo,
PtCallbackInfo t *cbinfo )
{
/* eliminate ’unreferenced’ warnings */
link instance = link instance, apinfo = apinfo,
cbinfo = cbinfo;
PtSetResource( ABW about version, Pt ARG TEXT STRING,
"1.00", 0);
return( Pt CONTINUE );
}
код помещает номер версии (1.00) в текстовый строковый ресурс для виджета about version. Чтобы сделать это, код вызывает PtSetResource (), чтобы установить ресурс для about version
виджета. Код использует PhAB-сгенерированную декларацию ABW_about version, которая обеспечивает доступ к указателю образца виджета. Мы можем использовать эту декларацию безопасно, так как мы имеем дело с модулем диалога — PhAB, гарантирует, что только один образец диалога будет существовать в любое данное время.
3. Сохраняем изменения и выходим из текстового редактора.
Компилирование и Выполнение
Теперь мы готовы компилировать и выполнить программу:
1. Скомпонуем и выполним наше приложение. Если наша программа компилируется и связывается без ошибок (так должно быть, если Вы редактировали функцию правильно), все будет работать.
2. Из выполняющейся прикладной программы, откройте Help и выберите About Demo. Диалог откроется, и Вы будете видеть номер версии (1.00) под меткой About this Demo. Обратите внимание, что диалог появляется в местоположении, которое Вы определили.
3. Теперь попробуем исполнить второй образец диалога. Как Вы видите, это не работает. PhAB всегда гарантирует, что есть только один образец виджета Диалога.
4. Нажимает Done, чтобы закрыть диалог, затем выходить из приложения, выбирая Quit из его меню File.
Обучающая программа 5. — создание окон
Из предыдущей программы tut4, Вы узнали, как обработать модули диалога, которые поддерживают только один экземпляр окна. В этой программе Вы узнаете, как обработать модули окна, которые поддерживают многооконный режим.
Эта программа использует приложение, которое было создано в предыдущей программе tut4.
Поддерживая многооконный режим, оконные модули обеспечивают больше гибкости чем диалоги. Но используя эту гибкость, Вы должны следить за именем каждого экземпляра окна. Выполнение приложения гарантирует что Вы правильно ссылаетесь на виджеты в пределах каждого экземпляра окна. Вы не можете безопасно использовать сгенерированную глобальную переменную ABW_xxx декларацию, так как она относится только к последнему созданному экземпляру. Чтобы упростить задачу работы в многооконном режиме, PhAB обеспечивает библиотечные функции API, которые позволяют Вам обращаться к любому виджету посредством имени его глобальной переменной (ABN_xxx).
Создание окна
Давайте создадим оконный модуль и прикрепим его к пункту меню New в разделе меню File в приложении tut4. Это окно будет содержать кнопки, которые изменяют цвет другого виджета.
В предыдущей программе tut4, Вы создавали модуль диалога изнутри редактора callback вызовов. Но на сей раз, Вы добавите окно из меню Project. В будущем, используйте любой метод, который Вы предпочитаете.
1. Делаем копию приложения tut4. и называем его tut5.
2. Отображаем модуль диалога aboutdlg.
3. Из меню Project, выберите Add Window. Когда PhAB запрашивает Вас относительно стиля окна, выбираем Plain (простой) стиль.
4. Изменяем имя экземпляра нового окна вместо Window0 на newwin, печатая новое имя в поле Name в панели управления.
5. Оконный модуль должен теперь быть выбранным пунктом.
Прикрепление callback вызовов
Поскольку модуль окна поддерживает многооконный режим, Вы должны создать функции кода, которые будут вызываться всякий раз, когда окно открывается или закрывается (то есть всякий раз, когда окно создается или удаляется). Так что давайте сначала устанавим callback вызов, чтобы обнаружить, когда окно закрывается:
1. Переключимся к панели управления callback вызовов, в случае необходимости.
2. Из списка callback вызовов, выберите Window Manager. Вы хотите использовать callback
вызов Администратора полиэкранного режима, так как он вызывается, когда Администратор полиэкранного режима Фотона закрывает окно.
3. В поле Function, напечатайте newwin_close. Вы не должны выбирать тип callback вызова заданный по умолчанию, выберите тот тип, который вам необходим. Нажмите Apply, потом Done.
4. Переключитесь в панель управления Ресурсов и выберите Flags. Удостоверьтесь, что Ph_WM_CLOSE флажок установлен (то есть подсвечен), затем нажмите Done. Этот флажок говорит Администратору полиэкранного режима уведомлять ваше приложение, когда окно закрывается.
5. Теперь давайте установим функцию, которая вызывается при открытии окна. Откройте модуль меню filemenu, затем выберите ресурс Menu Items в панели управления Ресурсов. Вы увидите редактор меню.
6. Удостоверимся, что пункт меню New в настоящее время выбран в списке Menu Items, затем нажимать значок Callback, чтобы открыть редактор callback вызовов.
7 Выбираем тип модуля Window, затем нажимают стрелку рядом с полем Name. Вы увидите список существующих оконных модулей.
8. Выбираем newwin, которое является окном, которое Вы только что создали.
9. В поле Setup Function, введите newwin_setup, как имя функции установки. Позже, Вы измените newwin_setup(), чтобы поддерживать многооконный режим.
10. Щелчкнем Apply, затем Done. Нажмем Done снова, чтобы закрыть редактор меню.
Добавление виджетов
Давайте теперь добавим некоторые виджеты к модулю окна newwin. Используя эти виджеты Вы узнаете, как обновлять информацию в текущем или других существующих оконных
1. Добавим PtRect виджет и четыре PtButton виджета следующим образом:
2. Теперь изменяем левую кнопку:
_Заменим текст метки кнопки с Button на Red.
_ Дадим имя экземпляру кнопки btn_red.
_ Прикрепим callback вызов Activate, определяя тип кода "Code", и имя функции color_change.
3. Изменяем среднюю кнопку:
_ Заменим текст метки кнопки с Button на Green.
_ Дадим имя экземпляру кнопки btn_green.
_Прикрепим также callback вызов Activate/Code, и дадим имя функции color_change.
4. Изменяем правую кнопку:
_ Заменим текст метки кнопки с Button на Blue.
_ Дадим имя экземпляру кнопки btn_blue.
_Прикрепим также callback вызов Activate/Code, и дадим имя функции color_change как и раньше.
5. Изменяем большую кнопку:
_ Заменим текст метки кнопки с Button на Change previous window’s сolor.
_ Дадим имя экземпляру кнопки btn_prev.
_Прикрепим также callback вызов Activate/Code, и дадим имя функции color_change как и раньше.
6. Наконец дадим имя прямоугольнику color_rect. Вы должны определить это имя так, чтобы функция color_change() могла изменять цвет прямоугольника. Ваше окно теперь должно выглядеть подобно этому:
Генерация и изменение кода
В предыдущей программе, Вы использовали сгенерированную ABW_xxx декларацию, чтобы обратиться к указателю экземпляра диалога. Вы не можете использовать эту декларацию, когда имеете дело с многооконным режимом, так как она обращается только к последнему созданному окну. Вместо этого, Вы должны добавить код к сгенерированной функции установки окна так, чтобы он сохранил копию указателей на каждый экземпляр окна в глобальном массиве виджетов. В этой программе, вам понадобятся для работы указатели на кнопку Change PreviousWindow Color.
Генерация кода
Открывает меню Build и выбирает Generate UI.
Измененим функцию newwin setup() так, чтобы она:
_ ограничивала номер возможных экземпляров до пяти
_сохраняла копию каждого указателя окна
_отображала номер экземпляра окна в оконном заголовке.
Редактируем файл newwin_setup.c следующим образом:
int win ctr = 0;
PtWidget t *win[5];
int
newwin setup( PtWidget t *link instance,
ApInfo t *apinfo,
PtCallbackInfo t *cbinfo )
{
char buffer[40];
/* eliminate ’unreferenced’ warnings */
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 Previous Window Color изменяем цвет фона предыдущего окна на цвет из массива.
Если бы это было модулем диалога, Вы могли бы использовать декларацию ABW_color_rect, чтобы модифицировать цвет прямоугольника. Однако, потому что мы имеем дело с оконными модулями, Вы должны использовать указатель экземпляра окна, в котором кнопка нажимается.
Чтобы получить указатель экземпляра виджета в текущем окне, Вы должны вызвать:
_ ApGetInstance (), чтобы получить указатель на окно, которое содержит виджет, который вызвал callback вызов
_ ApGetWidgetPtr (), чтобы получить указатель на виджет с данной ABN_... декларацией. Если бы существовал только один экземпляр окна, то можно было бы сделать следующим образом:
PtSetResource( ABW color rect, Pt ARG FILL COLOR,buffer, 0 );
Но в нашем случае функция color_change() должна использоваться так: