Вход/Регистрация
Программирование. Принципы и практика использования C++ Исправленное издание
вернуться

Страуструп Бьерн

Шрифт:

• Мы определяем наш объект класса Simple_window.

• Конструктор класса

Simple_window
регистрирует свою кнопку
next_button
в системе графического пользовательского интерфейса.

• Когда пользователь щелкает на изображении объекта

next_button
на экране, графический пользовательский интерфейс вызывает функцию
cb_next
.

• Функция

cb_next
преобразует низкоуровневую информацию системы в вызов нашей функции-члена next для нашего окна.

• После щелчка на кнопке функция

next
выполняет требуемое действие.

Это довольно сложный способ вызвать функцию. Однако помните, что мы работаем с основным механизмом, обеспечивающим взаимодействие мыши (или другого устройства) с программой. В частности, следует иметь в виду следующие обстоятельства.

• Как правило, на компьютере одновременно выполняется много программ.

• Программа создается намного позже операционной системы.

• Программа создается намного позже библиотеки графического пользовательского интерфейса.

• Программа может быть написана на языке, отличающемся от того, который используется в операционной системе.

• Описанный метод охватывает все виды взаимодействий (а не только щелчок на кнопке).

• Окно может иметь много кнопок, а программа может иметь много окон.

Однако, поняв, как вызывается функция

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

16.3.2. Цикл ожидания

Итак, что должна делать функция
next
класса
Simple_window
после каждого щелчка на кнопке в данном (простейшем) случае? В принципе мы хотели бы, чтобы эта операция останавливала выполнение нашей программы в некоторой точке, давая возможность увидеть, что было сделано к этому моменту. Кроме того, мы хотим, чтобы функция
next
возобновляла работу нашей программы после паузы.

// создаем и/или манипулируем некоторыми объектами, изображаем

// их в окне

win.wait_for_button; // работа программы возобновляется с этой

// точки

// создаем и/или манипулируем некоторыми объектами

На самом деле это просто. Сначала определим функцию

wait_for_button
.

void Simple_window::wait_for_button

// модифицированный цикл событий:

// обрабатываем все события (по умолчанию),

// выходим из цикла, когда переменная button_pushed становится

// true

// это позволяет рисовать без изменения направления потока

// управления

{

while (!button_pushed) Fl::wait;

button_pushed = false;

Fl::redraw;

}

Как и большинство систем графического интерфейса, библиотека FLTK содержит функцию, приостанавливающую работу программы, пока не произойдет какое-то событие. Версия этой функции в библиотеке FLTK называется
wait
. На самом деле функция
wait
делает много полезных действий, чтобы наша программа могла правильно возобновить работу, когда произойдет ожидаемое событие. Например, при работе под управлением системы Microsoft Windows программа должна перерисовать окно, которое было перемещено или ранее перекрыто другим окном. Кроме того, объект класса
Window
должен самостоятельно реагировать на изменение размеров окна. Функция
Fl::wait
выполняет все эти задания так, как это предусмотрено по умолчанию. Каждый раз, когда функция
wait
обрабатывает какое-то событие, она возвращает управление, чтобы наша программа могла выполнить какие-то действия.

Итак, когда кто-то щелкает на кнопке Next, функция

wait
вызывает функцию
cb_next
и возвращает управление (нашему циклу ожидания). Для того чтобы сделать это в функции
wait_for_button
, функция
next
должна просто присвоить булевой переменной
button_pushed
значение
true
. Это просто.

void Simple_window::next

{

button_pushed = true;

}

Разумеется, мы также должны где-то определить переменную

button_pushed
.

bool button_pushed; // Инициализируется в конструкторе

// значением false

После определенного периода ожидания функция

wait_for_button
должна восстановить прежнее значение переменной
button_pushed
и вызвать функцию
redraw
, чтобы все внесенные изменения были видны на экране. Именно это мы и сделали.

  • Читать дальше
  • 1
  • ...
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: