Графическая библиотека си. Средства построения графиков для.NET

18.04.2019

C++ - один из самых мощных и востребованных языков программирования. Ежедневно на нём пишут сотни приложений, зачастую использующих GUI. Однако работа с графикой не всегда удобна программисту - в таком случае применяют готовые графические библиотеки. Они позволят сделать разработку графической части приложений максимально быстрой и удобной.

SFML

Qt

Кроссплатформенная библиотека Cocos2D-X призванна упростить разработку мобильных игр. Поддерживает все те же платформы, что и Qt. Из плюсов стоит отметить доступность, удобство эксплуатации и создание отдельного конструктора игр, основанного на библиотеке Cocos Creator . В списке игр, основанных на движке, есть всемирно известная BADLAND, работающая на всех доступных платформах.

Кое-что ещё

Если при создании игры вам нужно работать с графикой и анимацией в больших объёмах, то лучше использовать Unity вместо Cocos2D-X. В Unity имеется возможность плавной интеграции с такими инструментами, как Photoshop, Maya или Blender. В Cocos2D-X вся графика добавляется извне и на неё ссылаются из кода.

В Рунете нет уроков по этой библиотеке, но на английском языке есть отличный курс от разработчиков.

Juce

Пожалуй, одна из самых известных графических библиотек. GTK+ - графический фреймворк, широко применямый во многих системах. Изначально он задумывался как компонент GIMP, но за 20 лет после выпуска первой стабильной версии он нашёл применение в сотнях других приложений.

Сейчас GTK+ - полноценный графический фреймворк, не уступающий тому же QT. Он поддерживает разные языки программирования и продолжает развиваться.

Кое-что ещё

В своё время библиотека создавалась в качестве альтернативы Qt, которая была платной. GTK+ - один из немногих фреймворков, которые поддерживают язык C. Библиотека кроссплатформенная, но есть мнение , что программы на Linux выглядят более нативно, чем на Windows или Mac (GTK+ хорошо поддерживается даже на KDE). Интересно, что из-за некоторых проблем с кроссплатформенностью Wireshark перешла на Qt.

Пример первой программы можно посмотреть на Википедии .

Другие интересные статьи по C++ можно посмотреть у нас .

Заключение

Выше представлены наиболее популярные технологии для работы с GUI не только на C++, но иногда и на других языках (например, Qt и GTK+). Однако всегда следует учитывать особенности той или иной технологии. Выпишите список функций своего приложения, ещё раз прочитайте описания всех библиотек и фреймворков, и только после этого выбирайте то, что действительно подходит больше всего для проекта.

Ниже рассмотрены библиотеки на C/C++, которые могут быть использованы в основе разработки библиотеки для генерации 2D финансовых графиков и индикаторов технического анализа.

Основными требованиями являются:

  • Наличие C/C++ API.
  • Наличие адекватной документации с примерами.
  • Наличие Python-пакета для экспериментов.
  • Относительно высокая скорость работы Python-пакета при рисовании >30000 линий.
  • Правильная работа со шрифтами, поддержка пиксельных шрифтов и возможность отключения сглаживания.

Итог к рассмотрению:

  • Pillow для работы в Python — быстрый, наличие документации.
  • gMagick++ или Magick++ для расширения C/C++ — быстрые, хорошо документированы на сайте ImageMagick.
  • SKIA или Cairo для работы с векторной графикой.

GraphicsMagic (Magick++)

Расширение для C++ форка GraphicsMagick библиотеки ImageMagick. С помощью библиотеки можно рисовать, обрабатывать картинки и сохранять в различных форматах. В отличии от родителя (IMagick) разработчики делают упор на производительности, оптимизации и безопасности.

Python-пакет PgMagick может работать как с GraphicsMagick, так и с ImageMagick. Библиотека интегрирована в Python с помощью Python-Boost. В отличие от Wand-Py работает в десятки раз быстрее, но при этом имеет худшую документацию для Python (надо все искать в документации C++-расширения Magick++).

ImageMagick (Magick++)

Расширение для C++ популярной библиотеки ImageMagick (IMagick). С помощью библиотеки можно рисовать, обрабатывать картинки и сохранять в различных форматах.

Wand-Py работает крайне медленно по сравнению с Pillow (форк стандартной библиотеки PIL для Python). Не удалось решить проблемы со шрифтами (добавляет сглаживание и размытие).

Cairo

Библиотека написанная на C для рендеринга векторной графики. Содержит функции для рисования двумерных изображений. Преимуществом отмечается (на форумах) хорошая документация. Работает медленнее SKIA (есть сравнение в интернете).

SKIA

Графическая библиотека написанная на C++ для рендеринга векторной графики. Используется в Google Chrome, Chrome OS, Mozilla Firefox, Android. Поддерживается Google. Куцая документация, но есть примеры. По сравнению с Cairo работает быстрее.

AGG (Anti-Grain)

Библиотека растровой графики написанная на C++. Последняя версия выпущена в 2006 году. Есть предположение, что данная библиотека лежит в основе PIL для Python (и Pillow).

15 апреля 2017 в 23:36

MakiseGUI - бесплатная библиотека графического интерфейса для микроконтроллеров

  • Программирование микроконтроллеров

Существует множество библиотек графического интерфейса для микроконтроллеров и встраиваемых систем, но многие из них имеют ограниченный функционал, сложность в использовании и интеграции, необходимость обязательного использования внешней оперативной памяти, а некоторые стоят больше, чем ваш проект целиком. Из-за этих причин и многих других было решено писать свою библиотеку.



Перед началом разработки я поставил себе цели:

  • Простота конечной разработки. Писать интерфейс не должно быть сложнее, чем используя WindowsForms и тп
  • Простота интеграции. Встроить и запустить интерфейс в приложении должно быть максимально просто на любом железе или ПО.
  • Чистый Си. Был использован только gnu-c99 и из библиотек только stdlib
  • Минимальное потребление RAM. Возможность использования на средних микроконтроллерах без внешней памяти(примерно 40kb с цветным дисплеем 320х240).
  • Достаточное количество графических элементов для комфортной разработки. Простое добавление новых.
  • opensource лицензия и бесплатное использование даже в коммерческих проектах

Пример без объяснений.

В качестве демонстрации возможностей библиотеки и примеров использования может быть использован проект созданный специально для этих целей: https://github.com/SL-RU/MakiseSDLTest


Он использует SDL2 для отрисовки и ввода и имеет примеры использования всех элементов и почти всех функций системы. Может быть скомпиллирован и запущен на любом linux дистрибутиве. На windows тоже, но лишь теоретически - сам не пробовал.


Видео работы:


Структура


Библиотека состоит из трёх чётко разделённых частей:


1) Ядро. Ядро состоит из интерфейса к драйверу, функций отрисовки в драйвер и функций отрисовки примитивов в буфер.


2) Драйвер. Драйвер обеспечивает всё общение с железом и с ПО, поэтому под каждую задачу придётся писать обычно свой, чтобы учесть все моменты(DMA, прерывания и тд). Драйвер лишь обеспечивает передачу изображения из буфера на железо и очищает буфер изображения. Как примеры, в проекте есть драйверы для дисплея на ili9340, а так же SDL2 для отладки библиотеки на компьютере. Ядро и драйвер могут работать отдельно, без GUI.


3) Сам GUI. Занимает бОльшую часть системы, тут воплощены все необходимые функции для работы интерфейса: контейнеры, элементы, системы отрисовки, фокуса, ввода, обработки событий и прочего.

GUI

Разработка графического интерфейса максимально приближена к объектно-ориентированному для максимальной простоты конечного программирования. Благодаря этому она имеет некоторые приятные особенности


Простейший пример, создающий кнопку на экране:


MHost host; //базовая структура системы, root-контейнер, содержащий все другие контейнеры и элементы. //метод будет вызыван при нажатии на кнопку void click(MButton *b) { printf("Button was clicked"); //выводим сообщение в стандартный поток b->text = "Clicked!"; //меняем текст кнопки } MButton button; //структура, содержащая всю информацию о кнопке void create_gui() { //создаём кнопку m_create_button(&button, //указатель на структуру кнопки host->host, //контейнер, в который будет добавлена кнопка после создания. В данном случае это контейнер MHost"a mp_rel(20, 20, //координаты элемента относительно левого верхнего угла 90, 30), //ширина, высота "Click me", //текст кнопки //События &click, //Вызывается при нажатии на кнопку 0, //Вызывается до обработки нажатия, может прервать обработку нажатия 0, //Вызывается при действиях с фокусом кнопки &ts_button //стиль кнопки); } void main() { //тут была инициализация MakiseGui, драйвера, MakiseBuffer и MHost. Запуск драйвера. create_gui(); while(1) { //драйвер вызывает функции рисовки //совершается ввод //и логика } }

Итого, этот пример создаёт на экране кнопку при нажатии на которую в стандартном потоке вывода появится надпись "Button was clicked" и текст кнопки изменится.

Инициализация

Инициализация предполагает только лишь запуск драйвера, задание размеров и выделение памяти для структур и буферов элементов. Чисто формальная операция. Как инициализировать систему можно поглядеть тут: https://github.com/SL-RU/MakiseSDLTest/blob/master/src/main.c в методе start_m();


Для начала использования GUI нужно создать makise_config.h и сконфигурировать его. В этом файле задаются системные дефайны и выбираются нужные драйверы дисплея. https://github.com/SL-RU/MakiseSDLTest/blob/master/makise_config.h

Ввод

Ввод приспособлен для работы в мультипоточных приложениях - он имеет очередь событий, которые посылаются интерфейсу при вызове makise_gui_input_perform(host);


Любое событие ввода представлено структурой MInputData.


Возможен ввод кнопок(список стандартных в makise_gui_input.h MInputKeyEnum), символов(пока нигде не используется) и ввод курсора(сенсорный экран или мышь). В примере с SDL используется ввод с клавиатуры и ввод мышью.

Контейнеры.

MContainer - структура контейнера.


Контейнеры содержат связанный список элементов. Из контейнеров можно удалять или добавлять элементы, перемещать их и совершать другие операции.


Позиция элемента в контейнере прямо влияет на очередь отрисовки и ввода.


Линкованый список осуществляется при помощи указателей на первый и последний элемент списка MElement и в структуре MElement имеются указатели на следующий и предыдущий элемент.

Элементы.

Любой элемент представлен ввиде структуры MElement, которая содержит в себе информацию о элементе, указатели на функции отрисовки, ввода, фокуса и тд элемента и указатель на его содержимое.


На данный момент существуют следующие элементы:

  • MButton - кнопка. Которая отображает текст посылает события при нажатии
  • MCanvas - простейший контейнер, который просто содержит элементы.
  • MLable - простейшее текстовое поле
  • MTextField - текстовое поле, поддерживающее перенос слов и переносы
  • MSlider - слайдер
  • MToggle - кнопка имеющая два состояния.
  • MSList - список. Может быть как просто списком, так и radio-кнопками, так и чекбосками. Поддерживает обычные списки и динамические линкованные.
  • MTabs - вкладки. Несколько переключаемых контейнеров.

Лучшей документацией являются примеры, поэтому для каждого элемента есть свои примеры использования. Как сложные, так и простые.


Количество элементов будет пополняться со временем. Да, тут нет многих необходимых функций - графики, изображения и тд. Но для моих целей они пока не нужны, но если вскоре понадобятся, то буду добавлять и публиковать в библиотеку. Так же не стесняйтесь добавлять свои или править существующие! Пулл-реквесты приветствуются.

Стили

Стиль элемента определяет его внешний вид. Cтиль задаёт цвета элемента в определённом состоянии. За это отвечают структуры MakiseStyle и MakiseStyleTheme. MakiseStyle содержит несколько MakiseStyleTheme для определённых состояний, а так же параметры шрифта.


Для кнопки стиль может выглядеть так:


MakiseStyle ts_button = { MC_White, //основной цвет. Не несёт никакого значения &F_Arial24,//Шрифт стиля 0, //межстрочное расстояние //цвет заднего фона | шрифта бортик есть ли двойной бортик {MC_Black, MC_Gray, MC_Gray, 0 }, //когда кнопка не активна {MC_Black, MC_White, MC_White, 0 }, //нормальное состояние {MC_White, MC_Green, MC_White, 0 }, //в фокусе {MC_Green, MC_White, MC_White, 0 }, //когда была кликнута };

Фокус

Фокус определяет к какому элементу пойдёт ввод. Для управления фокусом существуют следующие функции:


MFocusEnum makise_g_focus(MElement *el, MFocusEnum event); //фокусирует или расфокусирует нужный элемент MFocusEnum makise_g_host_focus_next(MHost *host);//переведёт фокус на следующий по очереди элемент MFocusEnum makise_g_host_focus_prev(MHost *host);//на предыдущий

Пример работы на микроконтроллере

Так же был написан пример библиотеки для STM32 микроконтроллеров. Был использован МК STM32f437VGT6 с тактовой частотой 180МГц и 2.2" дисплей 230х320 пикселей на контроллере ILI9341. Управления с компьютерной клавиатуры по UART.

Code::Blocks - свободная кроссплатформенная среда разработки. Code::Blocks написана на С++ и использует библиотеку wxWidgets. Имея открытую архитектуру, может масштабироваться за счёт подключаемых модулей. Поддерживает языки программирования С, С++, D (с ограничениями).

ConTEXT - бесплатный многооконный текстовый редактор с подсветкой синтаксиса основных популярных языков программирования, таких как C/C++, Delphi/Pascal, FORTRAN, 80x86 assembler, Java, JavaScript, Visual Basic, Perl/CGI, HTML, SQL, Python, PHP и т.п. Редактор может подключать внешние инструменты для компиляции или интерпретации исходного кода.

Eclipse - свободная интегрированная среда разработки модульных кроссплатформенных приложений. Развивается и поддерживается Eclipse Foundation.

Наиболее известные приложения на основе Eclipse Platform - различные «Eclipse IDE» для разработки ПО на множестве языков (Java, C/C++).

GTK+ (сокращение от GIMP ToolKit) - кроссплатформенная библиотека элементов интерфейса, имеет простой в использовании API, наряду с Qt является одной из двух наиболее популярных на сегодняшний день библиотек для X Window System.
Будучи изначально частью графического редактора GIMP, она развилась в отдельный проект и приобрела заметную популярность. GTK+ - свободное ПО, распространяемое на условиях GNU LGPL, позволяющей создавать как свободное, так и проприетарное программное обеспечение с использованием библиотеки. GTK+ является официальной библиотекой для создания графического интерфейса проекта GNU.

Konva.js - это JavaScript библиотека, которая добавляет интерактивность в HTML5 элемент canvas. Позволяет добавлять различные фигуры на холст, использовать для них обработчики событий, перемещать эти фигуры, изменять их масштаб, а также вращать, независимо друг от друга. Таким образом, поддерживается высокая производительность анимации, даже при большом количестве объектов.

Lazarus - свободная среда разработки программного обеспечения для компилятора Free Pascal на языке Object Pascal. Интегрированная среда разработки предоставляет возможность кроссплатформенной разработки приложений в Delphi-подобном окружении. На данный момент является единственным инструментом быстрой разработки приложений (RAD), позволяющим Delphi-программистам создавать приложения с графическим интерфейсом для Linux (и других не-Windows) систем.

MinGW (англ. Minimalist GNU for Windows), ранее mingw32, - компилятор, нативный программный порт GNU Compiler Collection (GCC) под Microsoft Windows, вместе с набором свободно распространяемых библиотек импорта и заголовочных файлов для Windows API. MinGW позволяет разработчикам создавать нативные приложения Microsoft Windows. В MinGW включены расширения для библиотеки времени выполнения Microsoft Visual C++ для поддержки функциональности C99 (современный стандарт языка программирования Си).

Система PascalABC.NET является совместной разработкой российских и немецких программистов, активно используется в ряде средних и высших учебных заведений России и ближнего зарубежья как основной язык для обучения студентов направления "Информационные технологии".