Программирование. Принципы и практика использования C++ Исправленное издание, стр. 215
};По существу, объект класса
MenuPoint xyWidgetMenuattach()Menuattach()MenuVector_refЕсли хотите создать всплывающее меню (“pop-up” menu), то сможете справиться с этой задачей самостоятельно (подробно об этом — в разделе 16.7).
16.5. Пример
Для того чтобы лучше ознакомиться с возможностями основных средств графического пользовательского интерфейса, рассмотрим окно для простого приложения, в котором происходит ввод, вывод и немного рисования.

Эта программа позволяет пользователю изобразить последовательность линий (незамкнутая ломаная; см. раздел 13.6), заданную как последовательность пар координат. Идея заключается в том, что пользователь постоянно вводит координаты (x, y) в поля ввода next x и next y; после ввода каждой пары пользователь щелкает на кнопке Next point.
Изначально поле ввода
current (x, y)current (x, y)current (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_polylineButtonIn_boxOut_boxКонструктор класса
Lines_windowLines_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Вся реальная работа выполняется кнопкой Next point. Ее функция обратного вызова устроена как обычно.
void Lines_window::cb_next(Address, Address pw) // " как обычно "