Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:
struct Lines_window:Window {
Lines_window(Point xy,int w,int h,const string& title );
Open_polyline lines;
private:
Button next_button; // добавляет пару (next_x,next_y)
// в объект lines
Button quit_button;
In_box next_x;
In_box next_y;
Out_box xy_out;
static void cb_next(Address, Address); //
обратный вызов
// next_button
void next;
static void cb_quit(Address, Address); // обратный вызов
// quit_button
void quit;
};
Линия изображается как объект класса
Open_polyline
. Кнопки и поля ввода-вывода объявляются как объекты классов Button
, In_box
и Out_box
, и для каждой кнопки в них предусмотрены функции-члены, реализующие желательное действие вместе с шаблонным обратным вызовом функции. Конструктор класса
Lines_window
инициализирует все его члены.
Lines_window::Lines_window(Point xy,int w,int h,const string& title)
:Window(xy,w,h,title),
next_button(Point(x_max–150,0),70,20,"Next point",cb_next),
quit_button(Point(x_max–70,0),70,20,"Quit",cb_quit),
next_x(Point(x_max–310,0),50,20,"next x: "),
next_y(Point(x_max–210,0),50,20,"next y: "),
xy_out(Point(100,0),100,20,"current (x,y): ")
{
attach(next_button);
attach(quit_button);
attach(next_x);
attach(next_y);
attach(xy_out);
attach(lines);
}
Иначе говоря, каждый элемент управления окном сначала создается, а потом связывается с окном.
Обработка кнопки Quit тривиальна.
void Lines_window::cb_quit(Address, Address pw) // "как обычно"
{
reference_to<Lines_window>(pw).quit;
}
void Lines_window::quit
{
hide; // любопытная идиома библиотеки FLTK для удаления окна
}
Все как обычно: функция обратного вызова (в данном случае
cb_quit
) передается функции (в данном случае quit
), выполняющей реальную работу (удаляющей объект класса Window
). Для этого используется любопытная идиома библиотеки FLTK, которая просто скрывает окно. Вся реальная работа выполняется кнопкой Next point. Ее функция обратного вызова устроена как обычно.
void Lines_window::cb_next(Address, Address pw) // "
как обычно "
{
reference_to<Lines_window>(pw).next;
}
Функция
next
определяет действие, которое действительно выполняется после щелчка на кнопке Next point: она считывает пару координат, обновляет объект Open_polyline
и позицию считывания, а также перерисовывает окно.
void Lines_window::next
{
int x = next_x.get_int;
int y = next_y.get_int;
lines.add(Point(x,y));
// обновляем текущую позицию считывания:
ostringstream ss;
ss << '(' << x << ',' << y << ')';
xy_out.put(ss.str);
redraw;
}
Все это совершенно очевидно. Функция
get_int
позволяет получить целочисленные координаты из объектов класса In_box
; поток ostringstream
форматирует строки для вывода в объект класса Out_box
; функция-член str
позволяет вставить строку в поток ostringstream
. Финальная функция, redraw
, необходима для представления результатов пользователю; старое изображение остается на экране, пока не будет вызвана функция redraw
из класса Window
. А что нового в этой программе? Посмотрим на ее функцию
main
.
#include "GUI.h"
int main
try {
Lines_window win(Point(100,100),600,400,"lines");
return gui_main;
}
catch(exception& e) {
cerr << "Исключение: " << e.what << '\n';
return 1;
}
catch (...) {
cerr << "Какое-то исключение\n";
return 2;
}
Так ведь здесь, по существу, ничего нет! Тело функции
main
содержит лишь определение нашего окна win
и вызов функции gui_main
. Ни других функций, ни операторов if
или switch
, ни цикла — ничего из того, чтобы изучали в главах 6–7, — только определение переменной и вызов функции gui_main
, которая сама вызывает функцию run
из библиотеки FLTK. Изучая программу далее, увидим, что функция run
— это просто бесконечный цикл.
Поделиться:
Популярные книги
Убийца
3. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.26
рейтинг книги
Блуждающие огни 3
3. Блуждающие огни
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
Камень Книга одиннадцатая
11. Камень
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Инкарнатор
1. Стеллар
Фантастика:
боевая фантастика
рпг
7.30
рейтинг книги
Его наследник
1. Наследники Сильных
Любовные романы:
современные любовные романы
эро литература
5.87
рейтинг книги
Real-Rpg. Город гоблинов
1. Real-Rpg
Фантастика:
фэнтези
7.81
рейтинг книги
Газлайтер. Том 16
16. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Любимая учительница
1. совершенная любовь
Любовные романы:
современные любовные романы
эро литература
8.73
рейтинг книги
Калибр Личности
2. Калибр Личности
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Возвращение
5. Другая сторона
Фантастика:
боевая фантастика
6.23
рейтинг книги
Бандит
1. Петр Синельников
Фантастика:
фэнтези
7.92
рейтинг книги
Везунчик. Дилогия
Везунчик
Фантастика:
фэнтези
попаданцы
8.63
рейтинг книги
Новый Рал 10
10. Рал!
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 18
18. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00