![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Unix C++ developer
Форумчанин
Регистрация: 16.04.2007
Сообщений: 651
|
![]()
Моей основной операционной системой является Linux, а основным окружением рабочего стола - Gnome.
Предидущий мой урок - Анимированный осциллограф на WinAPI (С++) вызвал интерес форумчан, поэтому я решил сделать кроссплатформенную версию этого импровизированного осциллографа и полностью переписал программу на GTK+. Данная статья может быть полезна всем, кто только начал или собирается изучать этот тулкит. Параллельно в уроке рассматривается использование некоторых функций мощной библиотеки двухмерной графики Cairo. В примере показана компиляция программы в Linux, пользователи Windows могу скомпилировать программу, например, с помощью MinGW, так же скомпилировать программу могут и пользователи Mac OS X. Вопросы компиляции на платформах, отличных от Linux выходят за рамки данной статьи и рассматриваться не будут. Те кто желает - всегда сможет разобраться самостоятельно, используя поиск. Урок будет изложен в моем обычном стиле - пошаговое, постепенное, рассмотрение кода и разбор каждой строчки. В конце будет приложен файл с полным исходным кодом. Но в начале немного теории. GTK+ - это кроссплатформенная библиотека, предназначенная для создания приложений с графическим интерфейсом пользователя, предоставляет богатый набор функций на все случаи жизни. Изначально библиотека разрабатывалась для программы Gimp. Библиотека написана на языке С, но тем не менее сохраняет принципы объектно-ориентированного программирования. Для использования возможностей библиотеки, в Вашей системе, должна быть установлена как сама библиотека, так и заголовочные файлы (dev, devel пакеты) к ней, все это Вы можете сделать с помощью менеджера пакетов Вашего дистрибутива. После установки всех недостающих компонентов можно подключать заголовочные файлы библиотеки в свою программу Код:
Настало время рассмотрения программы. Последний раз редактировалось oleg kutkov; 10.08.2009 в 16:22. |
![]() |
![]() |
![]() |
#2 |
Unix C++ developer
Форумчанин
Регистрация: 16.04.2007
Сообщений: 651
|
![]()
В самом начале программы подключаем необходимые заголовочные файлы, объявляем необходимые переменные и функции. Комментарии, думаю, все поясняют.
Код:
Первым делом мы должны объявить два виджета, это наше будущее окно и область, в которой мы будем рисовать Код:
Далее - инициализация gtk Код:
Теперь создаем новое окно и задаем ему необходимые параметры. Код:
Последний раз редактировалось oleg kutkov; 10.08.2009 в 05:30. |
![]() |
![]() |
![]() |
#3 |
Unix C++ developer
Форумчанин
Регистрация: 16.04.2007
Сообщений: 651
|
![]()
Следующей функцией мы создаем новый таймер, с интервалом срабатывания - 100 миллисекунд и привязываем к таким срабатываниями функцию time_handler.
Код:
Код:
Код:
Оставшиеся две функции выполняют отображение всех виджетов на экране и запуск основного цикла программы. Код:
Функция-обработчик сигнала закрытия окна Код:
Функция-обработчик сигнала таймера Код:
Если функция не завершилась - происходит увеление значения переменной, задающей смещение рисуемого графика. Так же обнуляется вспомогательная переменная, указывающая текущую точку на графике. Следующий вызов gtk_widget_queue_draw(widget) объявляет, переданный ему виджет, визуально недействительным и требующим перерисовки. Последний раз редактировалось oleg kutkov; 10.08.2009 в 13:53. |
![]() |
![]() |
![]() |
#4 |
Unix C++ developer
Форумчанин
Регистрация: 16.04.2007
Сообщений: 651
|
![]()
И наконец самое интересное - функция, выполняющая отрисовку координатной сетки и синусоиды. Для рисования используется библиотека Cairo, "встроенная" в Gtk. Мы будем использовать следующие методы:
gdk_cairo_create(GtkWidget* ) - данная функция создает, на основе переданного ей виджета, новый контекст рисования Cairo. cairo_rectangle (cr, x1, y1, x2, y2) - данная функция рисует, в контексте рисования Cairo прямоугольник по заданным координатам. cairo_set_line_width (cr, 3) - данная функция задает ширину линии, которой производится рисования в указанном контексте cairo_set_source_rgb (cr, r, g, b) - данная функция задает цвет линии, которой производится рисования в указанном контексте, параметры r, g, b определяют, соответственно, интенсивность красного, зеленого и синего цветов. cairo_move_to(cr, x, y) - с помощью этой функции мы переходим в новую исходную точку, из которой будем рисовать. cairo_line_to (cr, x, y) - задаем точку, куда следует нарисовать линию. cairo_stroke (cr) - собственно выполнение рисования в контексте. cairo_show_text(cr, buf*) - рисование текста в заданном контексте, в точке, предварительно заданной cairo_move_to. Собственно это все функции, которые выполняют всю работу в данном обработчике. Рисование самой синусоиды производится методом, знакомым по предидущему уроку. Ниже приведен полный исходный код функции, с комментариями Код:
|
![]() |
![]() |
![]() |
#5 |
Unix C++ developer
Форумчанин
Регистрация: 16.04.2007
Сообщений: 651
|
![]()
Компиляция исходного текста в файле osc.c выполняется командой
Код:
Скриншот итогового приложения: ![]() Полный исходный код: |
![]() |
![]() |
![]() |
#6 |
Форумчанин
Регистрация: 11.08.2009
Сообщений: 558
|
![]()
Вот мой вариант подобно осцилографа, с вариантами для Windows x86 и Linux.
Скрины ![]() ![]() Не обращайте внимание на "рваность" синусоиды в последнем скрине - это так криво снимает скрины стандартная прога линукса. Для создания программ использовал кроссплатформенный компилятор PureBasic http://pure-basic.narod.ru Уложился в 60 строк кода! ![]() Во вложении есть исходник, котрый без каких-либо изменений можно скомпилировать под Windows и Linux, а так же скопилированые проги для Windows x86 и Linux. |
![]() |
![]() |
![]() |
#7 | |
Linux C++ Qt ARM
Старожил
Регистрация: 30.11.2008
Сообщений: 3,030
|
![]()
Code Blocks, при запуске скомпилированной проги, выдает ошибку
Цитата:
Щас попробовал напрямую скомпилировать в gcc, без IDE - результат тот же.
Дилетант широкого профиля.
"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс |
|
![]() |
![]() |
![]() |
#8 |
Unix C++ developer
Форумчанин
Регистрация: 16.04.2007
Сообщений: 651
|
![]()
В моей программе ?
Так ничего невозможно сказать, хотя, по сути единственное место, где может падать - sprintf. Вообщем gdb в помощь ![]() |
![]() |
![]() |
![]() |
#9 |
Пользователь
Регистрация: 20.10.2009
Сообщений: 23
|
![]()
Спасибо за пример, очень пригодился.
А чтобы небыло ошибочег, меняем строку Код:
Код:
|
![]() |
![]() |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Анимированный осцилограф на WinAPI (С++) | oleg kutkov | Общие вопросы C/C++ | 36 | 26.02.2014 22:39 |
Анимированный Gif в компоненте Image | Ermiss | Мультимедиа в Delphi | 17 | 12.09.2010 06:11 |
Анимированный фон | Delph1n | Мультимедиа в Delphi | 11 | 31.01.2009 14:47 |