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

на главную - закладки

Жанры

Программирование. Принципы и практика использования 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
рейтинг книги
Калибр Личности 1

У врага за пазухой

Коваленко Марья Сергеевна
5. Оголенные чувства
Любовные романы:
остросюжетные любовные романы
эро литература
5.00
рейтинг книги
У врага за пазухой

Бракованная невеста. Академия драконов

Милославская Анастасия
Фантастика:
фэнтези
сказочная фантастика
5.00
рейтинг книги
Бракованная невеста. Академия драконов

Возвышение Меркурия. Книга 2

Кронос Александр
2. Меркурий
Фантастика:
фэнтези
5.00
рейтинг книги
Возвышение Меркурия. Книга 2

Наследник павшего дома. Том II

Вайс Александр
2. Расколотый мир [Вайс]
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наследник павшего дома. Том II

Попаданка в академии драконов 2

Свадьбина Любовь
2. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
6.95
рейтинг книги
Попаданка в академии драконов 2

Теневой путь. Шаг в тень

Мазуров Дмитрий
1. Теневой путь
Фантастика:
фэнтези
6.71
рейтинг книги
Теневой путь. Шаг в тень

Архил...? Книга 2

Кожевников Павел
2. Архил...?
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Архил...? Книга 2

Искатель. Второй пояс

Игнатов Михаил Павлович
7. Путь
Фантастика:
фэнтези
боевая фантастика
6.11
рейтинг книги
Искатель. Второй пояс

Решала

Иванов Дмитрий
10. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Решала

70 Рублей - 2. Здравствуй S-T-I-K-S

Кожевников Павел
Вселенная S-T-I-K-S
Фантастика:
боевая фантастика
постапокалипсис
5.00
рейтинг книги
70 Рублей - 2. Здравствуй S-T-I-K-S

Не верь мне

Рам Янка
7. Самбисты
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Не верь мне