Использование графического интерфейса библиотеки FLTK при создании программ на языке программирования С++. Учебно-методическое пособие
.pdfнастроек). Блок кода в визуальном редакторе Fluid также можно определять визуально. Выделите метод showWindow() в окне редактора и щелкните кнопку Code
в окне палитры инструментов Widget Bin. Теперь появился блок кода у метода showWindow(). Щелкните дважды мышью по пиктограмме блока в окне редактора и в открывшемся окне введите строку: mainWindow->show(argc, argv);
Метод |
showWindow() используется |
для вызова метода show() |
объекта mainWindow. |
|
|
Теперь |
можно сохранить проект, |
файлы проектов редактора |
Fluid являются обычным текстом, поэтому их можно редактировать в любом текстовом редакторе, учитывая его не стандартизованное хранение данных, так как редактор Fluid создавался еще до успеха XML.
Генерация C++ кода для класса DemoUi производится с помощью
команды «File>Write code |
….» В результате на диске появятся файлы с |
расширениями .cxx и .h. |
Следующим образом выглядит объявление |
класса DemoUi, созданное Fluid:
// generated by Fast Light User Interface Designer (fluid) version 1.0309
#ifndef demoUi_h #define demoUi_h #include <FL/Fl.H>
#include <FL/Fl_Double_Window.H> #include <FL/Fl_Button.H>
#include <FL/Fl_Output.H>
class DemoUi { public:
DemoUi();
Fl_Double_Window *mainWindow; Fl_Button *button1;
private:
inline void cb_button1_i(Fl_Button*, void*); static void cb_button1(Fl_Button*, void*);
public:
Fl_Output *textOut1;
void showWindow(int argc, char ** argv);
};
#endif
Методы cb_button1_i() и cb_button1() были сформированы редактором Fluid автоматически для обработки нажатия кнопки. Заданный код обработчика содержится в методе cb_button1_i(), а метод cb_button1() представляет собой обертку, предназначенную для вызова всех обработчиков, связанных с кнопкой.
11
Первый параметр обратного вызова есть всегда, в данном случае через него будет передан адрес объекта кнопки, зная, что главное окно является ее родительским виджетом, обращение к окну может быть записано:
o->parent()->hide();
Если необходимо обратиться к передаваемому объекту, то в данном случае используем второй параметр метода обратного вызова, например, для обращения к ранее созданному объекту мы вызываем метод обратного вызова с дополнительным параметром, в котором передаем нужный объект: button1->callback((Fl_Callback*)cb_button1, textOut1);
В методе обратного вызова тогда можно написать:
Fl_Output* w = (Fl_Output*)userdata; w->value("Нажато");
Конструктор класса DemoUi создает все ранее указанные объекты. Осталось написать функцию main() для нашей программы:
#include "demoUi.h"
int main (int argc, char ** argv)
{
DemoUi *ui = new DemoUi(); ui->showWindow(argc, argv); return Fl::run();
}
Главное окно программы создается в конструкторе объекта ui. После этого вызывается метод showWindow(), делающий окно видимым, и запускается цикл обработки сообщений. Функция Fl::run() реализует основной цикл и работает, пока есть хотя бы одно видимое окно, созданное нашей программой, когда же видимые окна закончились, она возвращает управление.
За возможностью виджетов менять размеры следят объекты класса Fl_Group. Возможность изменения размера производится методом resizable с параметром в виде адреса объекта типа Fl_Widget. Если параметром указать ноль, тогда данная группа не будет допускать изменения размеров. Когда параметром метода resizable является виджет, входящий в группу, тогда виджет, указанный в качестве параметра, будет менять и длину, и ширину, а виджеты, имеющие с ним непустое пересечение по горизонтальной оси, будут растягиваться и сжиматься только по горизонтали, виджеты, пересекающиеся с указанным виджетом по вертикальной оси, будут менять только вертикальный размер. Виджеты, не имеющие с выбранным виджетом пересечения ни по горизонтали, ни по вертикали, свои размеры менять не будут. На рисунке 3 показан пример, иллюстрирующий этот подход.
12
Рисунок 3 – Демонстрация изменения размеров окна и виджетов
Исходный текст примера находится в файле fltk/resize.срр.
При построении иерархии групп в каждый момент времени в программе либо есть ровно одна группа, называемая текущей, либо такой нет ни одной. Если текущая группа есть, все создаваемые виджеты автоматически помещаются в эту группу (становятся ее дочерними виджетами). При создании новой группы она автоматически становится текущей. Группу можно сделать текущей, вызвав метод begin(). Метод end()делает текущей группу, родительскую для данной, либо оставляет программу без текущей группы, если у той группы, для которой его вызвали, нет родителя. Для переключения между группами можно также воспользоваться статическим методом Fl_Group::current(), begin() просто вызывает current (this), а end() – current (parent()). С помощью метода add()
можно виджет включить в заданную группу. В классе Fl_Window присутствует метод size_range(), задающий минимально допустимые размеры окна по горизонтали и вертикали.
Помимо обычных кнопок, библиотека FLTK поддерживает целый ряд виджетов, классы которых унаследованы от Fl_Button, рисунок 4.
Рисунок 4 – Диаграмма наследования виджетов
13
Изменяя значения методов type() и when(), можно в программе контролировать тип виджета и условия выполнения метода обратного вызова,
например, написав button->type(FL_NORMAL_BUTTON), можно в программе указать, что объект button имеет тип простой кнопки, а с помощью метода when() установить флаги, используемые для принятия решения о вызове метода обратного вызова. Например, можно дополнительно использовать следующие флаги:
−FL_WHEN_CHANGED: обратный вызов выполняется каждый раз, когда пользователь изменяет текст.
−FL_WHEN_RELEASE: обратный вызов будет выполнен, когда виджет потеряет фокус.
−FL_WHEN_ENTER_KEY: если пользователь вводит клавишу Enter, обратный вызов выполняется, если текст изменился.
−FL_WHEN_ENTER_KEY | FL_WHEN_NOT_CHANGED: Клавиша Enter
выполнит обратный вызов, даже если текст не изменился.
Если значение метода when() равно нулю, то обратный вызов никогда не
выполняется.
Кнопка может иметь значение или буквенное сочетание клавиш, которое может быть указано в label() с символом «&» перед текстом метки. Значение представляет собой побитовое OR набора дополнительных флагов,
например, FL_ALT | «a», или FL_ALT | (FL_F + 10), или просто символ «а».
Нулевое значение отключает сочетание клавиш. Нажатая клавиша может быть получена с помощью функции event_key(). Флаги сдвига могут быть любым набором значений, полученных с помощью функции event_state(), к ним относятся FL_SHIFT, FL_CAPS_LOCK, FL_CTRL, FL_ALT, FL_NUM_LOCK,
FL_META, FL_SCROLL_LOCK, FL_BUTTON1, FL_BUTTON2, FL_BUTTON3.
Помимо обычных кнопок, FLTK поддерживает ряд виджетов, классы которых унаследованы от Fl_Button, рисунок 5.
Рисунок 5 – Кнопки библиотеки FLTK
FLTK предоставляет множество типов кнопок:
−Fl_Button – Стандартная кнопка.
−Fl_Check_Button – Кнопка с флажком.
−Fl_Light_Button – Кнопка с подсветкой.
14
−Fl_Repeat_Button – Кнопка, которая повторяется при удержании.
−Fl_Return_Button – Кнопка, активируемая клавишей Enter.
−Fl_Round_Button – Кнопка с кружком.
Fl_Check_Button является подписанным квадратиком, в который можно
поставить галочку: если щелкнуть по нему, галочка ставится, если щелкнуть еще раз – галочка исчезает.
Fl_Repeat_Button применяются для выбора из нескольких фиксированных вариантов и выглядят как кружочки, в одном из которых может стоять отметка, а рядом с кружочком помещается описывающий текст. Если щелкнуть по одной из таких кнопок, входящих в единую группу, то она становится помеченной, а остальные радиокнопки той же группы теряют статус выбранных. Радиокнопки автоматически объединяются в группу, если у них один родительский виджет. Если нужно создать несколько групп радиокнопок, достаточно описать соответствующее количество виджетов типа Fl_Group, а кнопки располагать в них.
Fl_Light_Button позволяет цветом отобразить состояние выбора.
Кроме кнопок, FLTK предоставляет несколько текстовых виджетов для отображения и получения текста:
−Fl_Input – Однострочное поле ввода текста.
−Fl_Output – Однострочный текстовый вывод.
−Fl_Multiline_Input – Многострочное поле ввода текста.
−Fl_Multiline_Output – Многострочное поле вывода текста.
−Fl_Text_Display – Виджет отображения многострочного текста.
−Fl_Text_Editor – Виджет многострочного редактирования текста.
−Fl_Help_View – Виджет отображения текста в формате HTML.
Виджеты Fl_Output и Fl_Multiline_Output используются только для отображения текста.
Для получения или установки отображаемой строки можно использовать метод value(), например, если ранее создан объект input класса Fl_Input: input->value("Какой-то текст");
Если программа использует несколько активных виджетов, в каждый момент только один из них обладает фокусом ввода, то есть является получателем ввода с клавиатуры, тогда можем принудительно возвращать фокус ввода выбранному виджету вызовом метода take_focus().
Виджеты вывода можно дополнить метками, чтобы прокомментировать, что за информация в них выдается.
Среди всех текстовых виджетов выделяется класс Fl_Multiline_Input, он позволяет вводить и редактировать текст, состоящий более чем из одной строки, но лучше использовать Fl_Text_Editor вместо Fl_Multiline_Input, так как он позволяет дополнительно использовать скроллинг и предназначен для
15
редактирования текстов большого объема. Текст в виджете является специальным объектом Fl_Text_Buffer. Пример его использования:
Fl_Text _Buffer * b = new Fl_Text _Buffer ;
Fl_Text _Editor * editor = new Fl_Text _Editor (x , у , w, h) ; editor->buffer (b) ;
Один буфер можно использовать одновременно с несколькими объектами типа Fl_Text_Editor. Его базовый класс Fl_Text_Display используется для просмотра текста без возможности его изменения.
В отличие от текстовых виджетов, могут также использоваться счетчики и объекты, которые отслеживают числовые изменения. FLTK предоставляет следующие классы, рисунок 6:
−Fl_Counter – Виджет с кнопками со стрелками, который показывает текущее значение.
−Fl_Dial – Круглая ручка.
−Fl_Roller – Движимый виджет.
−Fl_Scrollbar – Стандартный виджет полосы прокрутки.
−Fl_Slider – Полоса прокрутки с ручкой.
−Fl_Value_Slider – Ползунок, показывающий текущее значение.
Рисунок 6 – Счетчики и объекты, отслеживающие числовые изменения
16
Общим для них является метод value(), который получает или устанавливает текущее значение виджета, а также методы, задающие диапазон используемых значений, или методы minimum() и maximum().
Класс Fl_Widget является базовым для всех виджетов FLTK, он предлагает методы, задающие цвет фона и текста, стиль обрамления, а также текст, расположение, параметры шрифта и другие параметры. Для отображения рамки и какого-либо текста используется Fl_Box. Возможные типы рамок и оформления представлены на рисунке 7. Цвета виджетов хранятся в виде 32битного числа, которое может быть индексом в цветовой палитре из 256 цветов или 24-битным цветом RGB.
Наиболее распространенные цвета имеют символьные обозначения:
−FL_BLACK (черный цвет)
−FL_RED (красный)
−FL_GREEN (зеленый)
−FL_YELLOW (желтый)
−FL_BLUE (синий)
−FL_MAGENTA (пурпурный)
−FL_CYAN (голубой)
−FL_WHITE (белый)
Также могут быть использованы следующие обозначения:
−FL_FOREGROUND_COLOR (цвет текста)
−FL_BACKGROUND_COLOR (цвет фона)
−FL_INACTIVE_COLOR (цвет неактивного виджета)
−FL_SELECTION_COLOR (цвет выделения)
Пример присваивания цвета виджету показан в следующем:
button->color(FL_RED);
Если цвет определен 32-битным целым числом без знака, то его использование будет следующим:
button->color(0x000000ff);
Можно вместо кода цвета использовать результат, возвращаемый функцией fl_rgb_color(). Эта функция принимает три параметра целых числа, соответствующих компонентам RGB (красный, зеленый, синий), и возвращает число, подходящее в качестве аргумента для методов, настраивающих цвета, пример:
Fl_Color c = fl_rgb_color(85, 170, 255);
17
Рисунок 7 – Типы обрамления класса Fl_Box
Текст может быть задан через параметр конструктора при создании объекта виджета, также текст можно изменить, вызвав метод label(). Символ «@» в метках виджетов позволяет вставить пиктограмму из предопределенного набора, рисунок 8, если нужен сам этот символ, его нужно написать дважды, например, адрес электронной почты следует передать примерно в таком виде: vasya@@example.соm.
18
Рисунок 8 – Пиктограммы FLTK для текстовых меток
Любую пиктограмму можно повернуть на любой угол с точностью до 1°, развернуть вокруг горизонтальной или вертикальной оси, увеличить и уменьшить.
После знака @ можно вставить следующие модификаторы:
−модификатор размера от -9 (самый маленький) до +9 (самый большой);
−знак $, который обозначает отражение относительно вертикальной оси или % – относительно горизонтальной;
−цифру без знака, отличную от нуля, либо ноль и четыре цифры для обозначения угла поворота.
19
На рисунке 9 показан ряд примеров того, что можно сделать с пиктограммами. Исходный текст программы, нарисовавшей это окно, находится в файле fltk/labelpics.срр.
Рисунок 9 – Пример использования меток с пиктограммами
Выравнивание текста можно осуществить методом align() с помощью следующих констант:
−FL_ALIGN_CENTER (выравнивает метку по центру виджета).
−FL_ALIGN_TOP (выравнивает метку в верхней части виджета).
−FL_ALIGN_BOTTOM (выравнивает метку в нижней части виджета).
−FL_ALIGN_LEFT (выравнивает метку по левому краю виджета).
−FL_ALIGN_RIGHT (выравнивает метку по правому краю виджета).
−FL_ALIGN_LEFT_TOP (метка появится слева, выровненная по верхнему краю).
−FL_ALIGN_RIGHT_TOP (метка появится справа от виджета, выровненная по верхнему краю).
−FL_ALIGN_LEFT_BOTTOM (метка появится слева от виджета, выровненная по нижнему краю).
−FL_ALIGN_RIGHT_BOTTOM (метка появится справа от виджета, выровненная по нижнему краю).
−FL_ALIGN_INSIDE (задание положения метки внутри виджета).
−FL_ALIGN_CLIP (прикрепление метки к рамке виджета).
−FL_ALIGN_WRAP (перенос строк, не поместившихся в отведенное место).
−FL_ALIGN_TEXT_OVER_IMAGE (метка появится поверх изображения).
−FL_ALIGN_IMAGE_OVER_TEXT (показать изображение поверх текста).
−FL_ALIGN_IMAGE_NEXT_TO_TEXT (изображение появится слева от текста).
−FL_ALIGN_TEXT_NEXT_TO_IMAGE (изображение появится справа от текста).
20
