Программирование. Принципы и практика использования C++ Исправленное издание, стр. 437
#include <FL/Fl.h>#include <FL/Fl_Box.h>#include <FL/Fl_Window.h>int main(){ Fl_Window window(200, 200, "Window title"); Fl_Box box(0,0,200,200,"Hey, I mean, Hello, World!"); window.show(); return Fl::run();}Если что-то не работает, выполните следующее.
• Если вы получили сообщение компилятора, утверждающее, что файл с расширением
.lib(.lib• Если вы получили сообщение компилятора, утверждающее, что файл с расширением
.h.h• Если вы получили сообщение редактора связей, упоминающее о неразрешенных внешних ссылках, то проблема таится в свойствах проекта.
Если наши советы вам не помогли, зовите друга.
Приложение Д
Реализация графического пользовательского интерфейса
“Когда вы наконец поймете, что делаете,
то все пойдет правильно”
Билл Фэйрбэнк (Bill Fairbank)
В этом приложении представлена реализация обратных вызовов, а также классов
WindowWidgetVector_refД.1. Реализация обратных вызовов
Обратные вызовы реализованы следующим образом:
void Simple_window::cb_next(Address, Address addr)// вызов функции Simple_window::next() для окна,// расположенного по адресу addr{ reference_to<Simple_window>(addr).next();}Поскольку вы уже прочитали главу 17, то вам должно быть очевидно, что аргумент
Addressvoid*reference_to<Simple_window>(addr)Simple_windowaddrvoid*Как описано в разделе A.17, язык C++ предлагает способ для указания имени типа. Рассмотрим пример.
typedef void* Address; // Address — это синоним типа void*Это значит, что мы можем использовать имя
Addressvoid*Addressvoid*Итак, функция
cb_next()void*addrSimple_window&reference_to<Simple_window>(addr)Функция
reference_totemplate<class W>W& reference_to(Address pw)// интерпретирует адрес как ссылку на объект класса W{ return *static_cast<W*>(pw);}Здесь мы использовали шаблонную функцию, для того чтобы самостоятельно написать операции, действующие как приведение типа
void*Simple_window&static_castКомпилятор не имеет возможности проверить наши предположения о том, что аргумент
addrSimple_windowreference_toПолучив ссылку на объект класса
Simple_windowSimple_windowvoid Simple_window::cb_next(Address, Address pw)// вызов функции Simple_window::next() для окна,// расположенного по адресу pw{ reference_to<Simple_window>(pw).next();}Мы использовали довольно сложную функцию обратного вызова
cb_next()next()Д.2. Реализация класса Widget
Наш интерфейсный класс
Widget