Программирование. Принципы и практика использования 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
— это просто бесконечный цикл.
Поделиться:
Популярные книги
Пропала, или Как влюбить в себя жену
2. Исцели меня
Любовные романы:
современные любовные романы
6.70
рейтинг книги
Адепт: Обучение. Каникулы [СИ]
6. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.15
рейтинг книги
Калибр Личности 1
1. Калибр Личности
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
У врага за пазухой
5. Оголенные чувства
Любовные романы:
остросюжетные любовные романы
эро литература
5.00
рейтинг книги
Бракованная невеста. Академия драконов
Фантастика:
фэнтези
сказочная фантастика
5.00
рейтинг книги
Возвышение Меркурия. Книга 2
2. Меркурий
Фантастика:
фэнтези
5.00
рейтинг книги
Наследник павшего дома. Том II
2. Расколотый мир [Вайс]
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Попаданка в академии драконов 2
2. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
6.95
рейтинг книги
Теневой путь. Шаг в тень
1. Теневой путь
Фантастика:
фэнтези
6.71
рейтинг книги
Архил...? Книга 2
2. Архил...?
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Искатель. Второй пояс
7. Путь
Фантастика:
фэнтези
боевая фантастика
6.11
рейтинг книги
Решала
10. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
70 Рублей - 2. Здравствуй S-T-I-K-S
Вселенная S-T-I-K-S
Фантастика:
боевая фантастика
постапокалипсис
5.00
рейтинг книги
Не верь мне
7. Самбисты
Любовные романы:
современные любовные романы
5.00