Чтение онлайн

ЖАНРЫ

Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:

К типичным проблемам, выявляемым при отладке, относится и отсутствие изображений объектов
Shape
и
Widget
из-за отсутствия связи с окном или неправильного поведения объекта. Однако их описание выходит за рамки нашей книги. Посмотрите, как программист может создать и связать кнопку с меню, породив проблемы.

// вспомогательная функция для загрузки кнопки в меню

void load_disaster_menu(Menu& m)

{

Point orig(0,0);

Button b1(orig,0,0,"flood",cb_flood);

Button b2(orig,0,0,"fire",cb_fire);

// ...

m.attach(b1);

m.attach(b2);

// ...

}

int main

{

// ...

Menu disasters(Point(100,100),60,20,Menu::horizontal,
"disasters");

load_disaster_menu(disasters);

win.attach(disasters);

// ...

}

Этот

код не работает. Все кнопки являются локальными объектами в функции
load_disaster_menu
, и их связывание с меню не изменяет состояние самого меню. Объяснение этого факта приведено в разделе 18.5.4, а размещение локальных переменных в памяти было проиллюстрировано в разделе 8.5.8. Дело в том, что после возврата управления из функции
load_disaster_menu
эти локальные объекты были уничтожены, и меню disasters ссылается на несуществующие (уничтоженные) объекты. Результат неожиданный и неприятный. Устранить эту ошибку можно, используя неименованные объекты, созданные оператором new, а не именованные локальные объекты.

// вспомогательная функция для загрузки кнопки в меню

void load_disaster_menu(Menu& m)

{

Point orig(0,0);

m.attach(new Button(orig,0,0,"flood",cb_flood));

m.attach(new Button(orig,0,0,"fire",cb_fire));

// ...

}

Правильное решение даже проще, чем ошибочный код (впрочем, очень широко распространенный).

Задание

1. Создайте совершенно новый проект, связав его с библиотекой FLTK1. (Установки редактора связей описаны в приложении Г.)

2. Используя средства, описанные в файле

Graph_lib
, выведите какой-нибудь текст в программе из раздела 16.5 и выполните ее.

3. Модифицируйте программу так, чтобы она использовала всплывающее меню, как описано в разделе 16.7, и выполните ее.

4. Измените программу так, чтобы в ней было второе меню для выбора стиля линий, и выполните ее.

Контрольные вопросы

1. Зачем нужен графический пользовательский

интерфейс?

2. Когда нужен текстовый интерфейс?

3. Что такое уровень программного обеспечения?

4. Зачем нужны уровни программного обеспечения?

5. В чем заключается фундаментальная проблема взаимодействия с операционной системой с помощью языка C++?

6. Что такое обратный вызов?

7. Что такое виджет?

8. Как еще называют виджет?

9. Что означает аббревиатура FLTK?

10. Как читается аббревиатура FLTK?

11. О каких еще инструментах графического пользовательского интерфейса вы знаете?

12. Какие системы используют термин виджет, а какие — элемент управления окном?

13. Приведите примеры виджетов.

14. Когда используются окна редактирования для ввода?

15. Какие типы данных могут храниться в окнах редактирования для ввода?

16. Когда используется кнопка?

17. Когда используется меню?

18. Что такое инверсия управления?

19. Опишите основную стратегию отладки программ с графическим пользовательским интерфейсом.

20. Почему отладка программ с графическим пользовательским интерфейсом труднее, чем отладка обычной программы с потоками ввода-вывода?

Термины

Упражнения

1. Создайте класс

My_window
, похожий на класс
Simple_window
, за исключением того, что он имеет две кнопки: Next и Quit.

2. Создайте окно (на основе класса

My_window
) с шахматной доской 4x4. После щелчка на кнопке должно выполняться простое действие, например вывод ее координат в окно редактирования или изменение цвета (пока не будет выполнен другой щелчок на другой кнопке).

3. Разместите объект класса

Image
поверх объекта класса
Button
; после щелчка на кнопке переместите оба объекта. Для выбора нового местоположения кнопки с изображением используйте следующий генератор случайных чисел:

int rint(int low, int high)

{ return low+rand%(high–low); }

Эта функция возвращает случайное целое число в диапазоне

[low, high]
.

4. Создайте меню с пунктами “окружность”, “квадрат”, “равносторонний треугольник” и “шестиугольник”. Создайте окно редактирования (или два окна) для ввода пар координат и разместите фигуру, созданную после щелчка на соответствующей кнопке, в заданной точке. Не применяйте метод “перетащить и отпустить”.

5. Напишите программу, рисующую фигуру по вашему выбору и перемещающую ее в новую точку после щелчка на кнопке Next. Новая точка должна выбираться на основе пары координат, считанной из потока ввода.

6. Создайте “аналоговые часы”, т.е. часы с двигающимися стрелками. Определите время, используя средства операционной системы. Основная часть этого упражнения: найти функции, определяющие время дня и прекращающие выполнение программы на короткий период времени (например, на секунду), а также научиться использовать их по документации. Подсказка:

clock
,
sleep
.

Поделиться с друзьями: