Использование графического интерфейса библиотеки FLTK при создании программ на языке программирования С++. Учебно-методическое пособие
.pdfМинистерство цифрового развития, связи и массовых коммуникаций Российской Федерации
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Сибирский государственный университет телекоммуникаций и информатики» (СибГУТИ)
И. А. Бунцев
Использование графического интерфейса библиотеки FLTK при создании программ на языке программирования С++
Учебно-методическое пособие
Новосибирск
2024
1
УДК [004.43+004.514](075.8)
Утверждено редакционно-издательским советом СибГУТИ
Рецензент канд. техн. наук, доц. П.А. Приставка
Бунцев, И. А. Использование графического интерфейса библиотеки FLTK при создании программ на языке программирования С++ : учебно-методическое пособие / И. А. Бунцев ; Сибирский государственный университет телекоммуникаций и информатики, кафедра математического моделирования и цифрового развития бизнес-систем. – Новосибирск, 2024. – 55 с.
Хотя C++ обычно связан с системным программированием и созданием игр, он может стать отличной альтернативой созданию графического интерфейса пользователя. В работе рассматривается программирование с графическим интерфейсом на C++, распространенная и простая в реализации библиотека графического интерфейса FLTK, а также способы написания приложений с графическим интерфейсом.
Учебное пособие предназначено для студентов, обучающихся по программам направлений 09.03.03 «Прикладная информатика» и 01.03.02 «Прикладная математика и информатика».
©Бунцев И.А., 2024
©Сибирский государственный университет телекоммуникаций и информатики, 2024
2
|
Содержание |
|
1 |
Введение |
4 |
2 |
Общие положения |
6 |
3 |
Установка библиотеки и ее параметры |
7 |
4 |
Использование библиотеки |
8 |
5 |
Заключение |
53 |
6 |
Список литературы |
54 |
3
1 Введение
Ключевая задача интерфейса – сделать работу с машиной удобной. Раньше пользователям приходилось подстраиваться под компьютерные алгоритмы и использовать точные инструкции. Затем появилась графическая оболочка, которая сделала общение с компьютером более комфортным. Графический интерфейс пользователя (GUI) – это графическая оболочка с оконным менеджером, позволяющая запускать приложения без необходимости взаимодействия с консолью (CLI – command-line interface, интерфейс командной строки).
Переход от командной строки к графическому интерфейсу занял около полувека. CLI по-прежнему остается популярным инструментом, но все больше пользователей используют графическую оболочку для удобной работы.
Графический интерфейс можно смело назвать ступенькой эволюции во взаимодействии оператора и машины. Развитие технологий сделало компьютеры доступнее для пользователей, а разработка графической оболочки снизила порог входа, освоить компьютер стало проще.
Графический интерфейс преимущественно работает с графикой, и к нему можно легко получить доступ с помощью мыши, тачпада или сенсорных экранов. Графические оболочки интуитивно понятны. В GUI проще освоиться, в отличие от CLI, где нужно запоминать широкий спектр команд и синтаксис. В графическом интерфейсе пользователю проще работать. GUI есть в большинстве современных программ, кроме тех, которые не взаимодействуют с пользователем, также в графическом интерфейсе удобнее работать с сайтами, он хорош при многозадачности и позволяет быстро переключаться между окнами.
GUI считается развитием интерфейсов после CLI. Исторически командная строка считается более функциональной и безопасной, чем графическая оболочка, а GUI более удобным и легким для пользователей, с его помощью взаимодействие пользователя с программой осуществляется с помощью манипуляции объектами на экране.
C и C++ – одни из самых популярных компилируемых языков. Они создают более эффективный код, чем интерпретируемые языки. Разработчики инструментария, как правило, предпочитают C++, а не C, поскольку графические элементы могут быть записаны в виде классов, что позволяет использовать наследование для изменения внешнего вида элементов и определения действий, связанных с элементом.
Если не требуется разрабатывать инструментарий с графическим интерфейсом с нуля, то вместо этого можно выбрать один из многих доступных. Выбор будет зависеть от различных условий, например:
1. Инструментарий должен быть портативным, то есть работать в основных операционных системах: Windows, OS X и Linux.
4
2.Инструментарий должен быть бесплатным для использования, и не должно быть никаких ограничений на программное обеспечение, созданное с использованием инструментария.
3.Другое, например, простота использования, внешний вид, поддержка и
т.д.
Нередко возникают ситуации, когда необходимо обработать информацию
исформировать из нее новые данные, эти ситуации не являются единичными как для системных инженеров, администраторов, так и для программистов. Сооружать сложную конструкцию ради кратковременной и не высоко требовательной задачи считается нерациональным решением, но и использование готовых шаблонов также не всегда удобно. Также полученный код хотелось бы использовать в других операционных системах. Хорошо, если можно сосредоточиться только на выполнении основного массива действий и не беспокоиться о пользовательских интерфейсах или деталях реализации. Программа должна каким-то образом взаимодействовать с операционной и оконной системой. Это дает три варианта:
−можно просто не писать графические программы и делать все в текстовом режиме взаимодействия с пользователем;
−можно изучить специфику операционной системы, для которой пишем программу, и работу с ее оконной системой;
−можно положиться на инструментарий, обеспечивающий более простой уровень абстракций.
Но так как первый подход сейчас не является особо актуальным во взаимодействии с пользователем, а подход 2 довольно сложен, то проще выбрать третий вариант. Цель пользовательского интерфейса – помочь как можно проще открыть окно на экране, чтобы можно было сосредоточиться на изучении того, что будет происходить внутри окна. Другая цель состоит в предоставлении достаточно простых инструментов пользовательского интерфейса для создания интерактивных программ. Поэтому в работе рассматривается графический интерфейс, предназначенный для создания кроссплатформенных приложений, FLTK (англ. Fast Light Tool Kit).
5
2 Общие положения
FLTK – открытый кроссплатформенный набор виджетов, написанный на C++ и предназначенный для программирования на этом языке. Поддерживаемые платформы – Windows, MacOS и различные UNIX/Linux. Одна из отличительных черт FLTK – статическое связывание. Так сложилось, что другие популярные библиотеки по умолчанию пользуются динамической компоновкой, а FLTK – статической. Это было сделано путем разбития библиотеки на множество мелких объектов и проектирования так, чтобы функции, которые не используются, не имели указателей и не были связаны между собой.
У каждого подхода есть свои достоинства и недостатки. Связывание с разделяемыми объектами позволяет сэкономить место на диске в том случае, если библиотека используется множеством разных программ. Кроме того, разделяемые модули упрощают процесс обновления. Если библиотека не относится к числу часто используемых, у статического связывания есть одно преимущество: интеграция кода библиотеки в исполняемые файлы приложения упрощает установку. Способ связывания накладывает отпечаток на структуру библиотеки. Для эффективного статического связывания разработчики свели к минимуму количество внутренних зависимостей.
FLTK поставляется с полным бесплатным исходным кодом. Доступен FLTK в соответствии с условиями библиотеки GNU GPL с исключениями, допускающими статическое связывание.
Также FLTK обладает еще одной отличительной характеристикой: встроенной в пакет поддержкой OpenGL (OpenGL предоставляет возможности
вывода |
графики |
в |
окне). |
После |
выхода Qt |
версии |
4, |
в |
которой OpenGL используется для |
вывода |
не только |
трехмерной, |
но |
и |
|||
традиционной для виджетов двумерной графики, FLTK нельзя считать лидером в этом, но раньше многие выбирали FLTK именно ради OpenGL. Необходимо учитывать, что за универсальность приходится платить избыточным кодом. Практичнее использовать набор инструментов пользовательского интерфейса. FLTK поддерживает множество других функций, чем GL, имеет поддержку окон, виджетов и имеет модель обработки событий.
Интерфейсы, создаваемые с помощью FLTK, отличаются краткостью и хорошо подходят для написания программ, не требующих сложного пользовательского интерфейса. Ее достоинством является особенность понятного построения кода программ. За счет простоты достигаются скорость составления каркаса программы и дальнейшая скорость выполнения. Минус разработки на основе FLTK заключается в ее же простоте: некоторых конструкций, которые есть в других средствах разработки, просто нет.
Перед использованием библиотеки FLTK коротко рассмотрим ее установку в среде Windows. Для упрощения и уменьшения времени, подготовка и установка библиотеки рассматривается для MinGW.
6
3 Установка библиотеки и ее параметры |
|
|
|
||
MinGW (англ. Minimalist |
GNU |
for |
Windows) |
– |
набор |
инструментов разработки программного обеспечения для создания приложений под Windows. Включает в себя компилятор, программный порт GNU Compiler Collection (GCC) под Windows вместе с набором свободно распространяемых библиотек импорта и заголовочных файлов для Windows API. Исходно (для 32битных систем) поддерживает стандарт C++11.
Скачиваем себе на компьютер последнюю версию FLTK с официального сайта. Архив может называться fltk-версия-source.tar.gz. Распаковываем его в любое удобное место. Теперь нужно запустить MSYS. Переходим в место установки MSYS (например, MinGw\msys\1.0) и запускаем msys.bat. Используя команду cd, переходим в каталог с распакованной библиотекой FLTK,
вводим «./configure --enable-threads --enable-localjpeg --enable-localzlib --enable- localpng». Параметры конфигурирования «--enable-…» определяют включение дополнительных элементов при компилировании библиотеки, например:
--enable-cygwin |
Использование Cygwin |
|
--enable-x11 |
Использование X11 (в комплексе с |
|
|
Cygwin) |
|
--enable-cairoext |
Использование |
дополнительных |
|
инструментов Сairo |
|
--enable-cairo |
Использование Cairo |
|
--enable-debug |
Включение отладки |
|
--enable-cp936 |
Включение CP936 |
|
--enable-gl |
Использование OpenGL |
|
--enable-shared |
Использование |
разделяемых |
|
библиотек |
|
--enable-threads |
Использование потоков |
|
--disable-largefile |
Исключение поддержки больших |
|
|
файлов |
|
--enable-localjpeg |
Использование JPEG |
|
--enable-localzlib |
Использование ZLIB |
|
--enable-localpng |
Использование PNG |
|
--enable-xinerama |
Использование Xinerama |
|
--enable-xft |
Использование Xft |
|
--enable-xdbe |
Использование Xdbe |
|
--enable-xfixes |
Использование Xfixes |
|
--enable-xcursor |
Использование Xcursor |
|
--enable-xrender |
Использование Xrender |
|
7
4 Использование библиотеки
Окно – это прямоугольная область экрана, описываемая объектом графической подсистемы. Различают окна верхнего уровня и дочерние. Окно верхнего уровня является самостоятельным субъектом, обычно снабжается заголовком, рамкой и элементами оформления, позволяющими передвигать окно, менять его размер, «выкладывать» его поверх других окон или скрывать, чтобы другие окна стали видны. Внутри окна верхнего уровня могут располагаться дочерние окна, они тоже могут содержать другие окна. Второй термин – виджет (widget) – элемент графического интерфейса, к виджетам относятся различные кнопки, «галочки», надписи, поля ввода текста и т. п. Виджеты могут быть вложены друг в друга, любая система предусматривает в том или ином виде возможность группировать виджеты. Библиотека FLTK также позволяет создавать дочерние окна, но требуется это редко, например, чтобы использовать возможности библиотеки OpenGL. Все, что связано с внешним видом виджетов, позиционированием, наложением друг на друга и т.п., FLTK помнит и обрабатывает самостоятельно.
Практическое знакомство с FLTK начнем, как обычно, с программы «Hello World»:
#include <FL/Fl.H> #include <FL/Fl_Window.H> #include <FL/Fl_Box.H>
int main (int argc, char ** argv)
{
Fl_Window *window; Fl_Box *box;
window = new Fl_Window (300, 180); window->begin();
box = new Fl_Box (20, 40, 260, 100, "Hello World!"); box->box (FL_UP_BOX);
box->labelsize (36);
box->labelfont (FL_BOLD+FL_ITALIC); box->labeltype (FL_SHADOW_LABEL); window->end();
window->show(argc, argv); return(Fl::run());
} |
|
|
|
Кажется, что все идет по стандартной |
схеме: |
создаем |
объект |
класса Fl_Window, представляющий главное окно, |
затем |
– простой |
виджет |
(объект класса Fl_Box), настраиваем его внешний вид: рамка (FL_UP_BOX), размер шрифта (36), свойства шрифта (FL_BOLD+FL_ITALIC) и вид выводимого текста (FL_SHADOW_LABEL), затем вызываем метод show() объекта главного окна и запускаем цикл обработки сообщений с
8
помощью функции Fl::run(), в библиотеке FLTK нет отдельного класса, отвечающего за работу приложения, поэтому Fl::run() – самостоятельная функция. FLTK понимает, что виджеты, созданные между вызовами методов begin() и end() объекта главного окна, принадлежат ему. Программу можно скомпилировать с помощью команды:
g++ helloworld.cxx -o helloworld -lfltk
Имя библиотеки, переданной в ключе -l, указывает на то, что мы пользуемся библиотекой FLTK. Как правило, используется следующая схема именования файлов библиотек: имя файла библиотеки начинается с префикса «lib», за ним следует собственно имя библиотеки, в конце расширение «.a» (archive) – для статической библиотеки или «.so» (shared object) – для разделяемой (динамической), после расширения через точку могут быть перечислены цифры номера версии (для динамической библиотеки). Имя соответствующего библиотеке заголовочного файла, как правило, состоит из имени библиотеки (без префикса и версии) и расширения «.h».
Окно программы HelloWorld можно перемещать по экрану, но изменить его размер не получится. Причина этого в том, что единственный виджет в окне имеет заданный размер и не предусматривает его изменения.
У FLTK есть собственный визуальный редактор под названием Fluid. Редактор Fluid генерирует исходные тексты на целевом языке программирования, то есть конечным результатом его работы являются файлы исходных текстов на C++. Fluid не похож на современные визуальные редакторы, возможная причина этого в том, что разработка FLTK началась в 1998 году. Проектирование интерфейса с помощью Fluid включает в себя визуальное проектирование кода и начинается с объявления главного класса. В палитре инструментов (Widget Bin) выбираем кнопку Class (рисунок 1).
Рисунок 1 – Палитра инструментов программы Fluid
В рабочей области редактора появляется иконка нового класса, а перед нами открывается окно, в котором мы должны ввести его имя (поле name). Назовем наш класс DemoUi. Далее мы должны сделать то, что мы обычно делаем, объявляя новые классы: создать конструктор. Выделяем класс DemoUi в окне редактора и выбираем в палитре инструментов кнопку «function». В окно редактора будет добавлена заготовка нового метода класса DemoUi. В окне описания функции «Function/Method Properties» в поле name/args вводим значение DemoUi(), так определяется заголовок метода. Так как имя метода
9
совпадает с именем класса, редактор поймет, что имеет дело с конструктором. Все объекты, представляющие элементы главного окна, будут полями главного класса. Эти поля инициализируются в конструкторе DemoUi(), поэтому главное окно приложения должно быть дочерним элементом конструктора. Выделяем значок конструктора в окне редактора, а в палитре инструментов Widget Bin выбираем кнопку Window. В окно редактора будет добавлен элемент «Window».
На вкладке свойств элемента Window с название Fl_Window Properties можно настроить внешний вид окна. Переключимся на вкладку «C++» и введем текст mainWindow в поле Name. Таким образом мы задали имя объекта главного окна. Все виджеты, расположенные в окне, должны быть дочерними элементами Window. Добавьте в окно элемент Button (кнопка) и Output (текстовая метка). Объекту класса Button присвойте имя «button1» (поле Name), а объекту класса Output – имя textOut1. Иерархия визуальных элементов приложения будет похожа на представленную на рисунке 2.
Рисунок 2 – Иерархия визуальных элементов класса DemoUi
После добавления кнопки создадим функцию-обработчик щелчка по ней. В окне редактора дважды щелкаем по пиктограмме элемента button1 и в окне настроек (button1 Properties) переходим на вкладку C++. В поле ввода Callback добавляем текстовую строку:
textOut1->value("Нажато");
Теперь нажатие на кнопку приведет к изменению текста метки. Для присвоения новой строки текстовой метке вызывается метод value() с параметром типа char *. Если нужно прочитать текст метки, то нужно вызвать перегруженный вариант метода value() без параметров.
Редактор Fluid позволяет добавлять в заготовку класса методы, не имеющие прямого отношения к визуальным объектам, поэтому добавим в класс DemoUi метод showWindow(). Выделите в редакторе пиктограмму класса DemoUi и щелкните кнопку Function
в окне палитры инструментов Widget Bin. Заголовок нового метода должен иметь вид
showWindow(int argc, char ** argv)
В качестве возвращаемого значения укажем void. Необходимо, чтобы метод showWindow() и конструктор DemoUi() были публичными (public в окне
10
