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

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

Жанры

Программирование. Принципы и практика использования 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
рейтинг книги
Блуждающие огни 3

Камень Книга одиннадцатая

Минин Станислав
11. Камень
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Камень Книга одиннадцатая

Инкарнатор

Прокофьев Роман Юрьевич
1. Стеллар
Фантастика:
боевая фантастика
рпг
7.30
рейтинг книги
Инкарнатор

Его наследник

Безрукова Елена
1. Наследники Сильных
Любовные романы:
современные любовные романы
эро литература
5.87
рейтинг книги
Его наследник

Real-Rpg. Город гоблинов

Жгулёв Пётр Николаевич
1. Real-Rpg
Фантастика:
фэнтези
7.81
рейтинг книги
Real-Rpg. Город гоблинов

Газлайтер. Том 16

Володин Григорий Григорьевич
16. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 16

Любимая учительница

Зайцева Мария
1. совершенная любовь
Любовные романы:
современные любовные романы
эро литература
8.73
рейтинг книги
Любимая учительница

Калибр Личности

Голд Джон
2. Калибр Личности
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Калибр Личности

Возвращение

Кораблев Родион
5. Другая сторона
Фантастика:
боевая фантастика
6.23
рейтинг книги
Возвращение

Бандит

Щепетнов Евгений Владимирович
1. Петр Синельников
Фантастика:
фэнтези
7.92
рейтинг книги
Бандит

Везунчик. Дилогия

Бубела Олег Николаевич
Везунчик
Фантастика:
фэнтези
попаданцы
8.63
рейтинг книги
Везунчик. Дилогия

Новый Рал 10

Северный Лис
10. Рал!
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Новый Рал 10

Идеальный мир для Лекаря 18

Сапфир Олег
18. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 18