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

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

Шрифт:

Изначально поле ввода

current (x, y)
остается пустым, а программа ожидает, пока пользователь введет первую пару координат. После этого введенная пара координат появится в поле ввода
current (x, y)
, а ввод каждой новой пары координат приводит к появлению на экране новой линии, проходящей от текущей точки (координаты которой отображаются в поле ввода
current (x, y)
) до только что введенной пары (x, y), а сама точка (x, y) становится новой текущей точкой.

Так рисуется незамкнутая ломаная. Когда пользователь устанет, он щелкнет на кнопке Quit. Следуя этой простой логике, программа использует несколько полезных средств графического пользовательского интерфейса: ввод и вывод текста, рисование линии и многочисленные кнопки. Окно, показанное выше, демонстрирует результат после ввода двух пар координат. После семи шагов на экране отобразится следующий рисунок.

Определим класс для рисования таких окон. Он довольно прост.

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
и позицию считывания, а также перерисовывает окно.

  • Читать дальше
  • 1
  • ...
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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