![]() |
Программирование графических приложения для Linux.
Glade & Gtk.
В последнее время операционная система Linux, становится все более популярной среди пользователей. Для нее написано уже достаточно много программ, улучшен графический интерфейс, конечно, сложность в конфигурирование еще существует, но это не значительное неудобство для пользователя, особенно для опытного. Ядро системы обновляется несколько раз в год, приложения пишутся сообществами пользователей, благодаря этому Linux очень быстро развивается, что ж и мы не будем стоять в сторонке, а попробуем научиться писать полноценные программы, для этой цели создано множество инструментов, сегодня, мы обойдемся Glade. Библиотекой GTK, компилятором gcc и текстовым редактором, хотя вместо него я советую использовать Geany, во-первых, он выдает подсказки, во-вторых, основываясь на отчетах компилятора, подчеркивает ошибки, и строки для которых есть предупреждения, что очень удобно. Цитата:
Формат файла проекта – GtkBuilder. Требуемая версия библиотек – здесь можно выбрать из нескольких версий библиотек, но я рекомендую использовать самую последнюю. Теперь нужно создать главное окно программы, для этого слева на панели выбираем виджет «окно», но с добавлением других компонентов не спешите. Если вы программировали в среде Delphi или Visual Basic, то знаете что компоненты там можно бросать на форму и произвольно перетаскивать с помощью мыши, здесь дело обстоит несколько иначе. Для расположения компонентов используются так называемые контейнеры, существуют разные типы контейнеров, но все они похожи. Добавим на форму компонент «вертикальный контейнер», появится окно, в котором нужно выбрать «число элементов» выбираем три. Форма разделилась на три части, добавим в самую верхнюю контейнер «строка меню». В среднюю виджет «область текста», и в оставшуюся виджет «строка состояния». У нас получилось форма напоминающая «текстовый редактор», да сегодня мы с вами напишем простой блокнот, почти такой же, как под Windows. Выделим главное окно и впишем в свойство «заголовок окна» - «Блокнот». Также посмотрите другие свойства, поэкспериментируйте с ними. В контейнере «строка меню», удалите заголовок вид, для этого просто выделите его и нажмите клавишу «delete». Для виджета «область текста», создадим текстовый буфер, для этого в свойствах найдем «буфер», после создания назначим ему имя «buffer». А также нам нужен диалог «о программе», выбираем его на панели виджетов среди окон и добавляем в проект. Редактируем нужные вам свойства, там все интуитивно понятно. Сохраняем как GuiNotepad.xml, расширение обязательно должно быть xml, а не glade. Вот что получилось у меня. Пришло время взглянуть на нашу программу в откомпилированном виде. Создаем текстовый файл с расширением C, в том же каталоге что и файл Glade. И пишем туда следующий код: Листинг: код программы. PHP код:
Теперь взглянем на плоды наших трудов, для этого откомпилируем код и запустим приложение. Цитата:
Если вы меня послушались и вместо текстового редактора используете Geany, то прежде чем компилировать зайдите в меню «сборка|параметры сборки» и изменить поле «собрать» на следующее: Цитата:
PHP код:
Функция gtk_window_set_title устанавливает заголовок окна, для этого ей нужно передать указатель типа GtkWindow на само окно, и указатель типа gchar на строку, которая станет его заголовком. При передаче параметров функции мы преобразовываем типы (GtkWindow *) и (gchar*), этого делать не обязательно и без преобразования все прекрасно работает, но мы ведь с вами приличные программисты, потому будем соблюдать правила хорошего тона. Функция gtk_text_buffer_set_text, присваивает «текстовому буферу» определенный текст, для этого ей нужно передать указатель на буфер, на сам текст в данном случае мы передаем "\0" – ноль байт, что эквивалентно очистке текстового поля, и последним параметром служит длина передаваемой строки, ставьте -1 для не определенной длины. Следующая кнопка – «Открыть», точно так же, как и для кнопки «создать» назначаем ей обработчик события, и дописываем такой код: Листинг: обработчик для кнопки «Открыть» PHP код:
Весь предыдущий код, нужен лишь для того чтобы вызвать и создать окно выбора файлов, которое реализовано объектом GtkFileChooserDialog и получить путь до файла, я специально не описывал этот виджет в glade, потому, что такая реализация более удачная, виджет создается на «лету». Функция gtk_file_chooser_dialog_new – создает новый диалог, в качестве первого параметра ей передается заголовок окна, второй параметр указывает на родительский объект, в нашем случае это mainwindow. Третий параметр определяет, какое окно создавать (для открытия, или для сохранения), остальные параметры отвечают за кнопки, которые будет расположены на окне. Функция gtk_dialog_run, делает окно видимым и реагирует на нажатие кнопок, как параметр ей нужно передать ранее созданный диалог типа GtkDialog, функция GTK_DIALOG нужна для преобразования типа, кстати говоря, мы могли использовать и стандартное C-ишное преобразование (GtkDialog*). Если пользователь нажмет кнопку «открыть» функция gtk_dialog_run вернет значение GTK_RESPONSE_ACCEPT. Тогда мы должны определить имя и путь к выбранному файлу, для этого и существует функция gtk_file_chooser_get_filename, она возвращает значение типа gchar в котором содержаться нужные нам данные, а как параметр ей передается созданный ранее диалог, причем мы должны преобразовать его тип в GtkFileChooser. Далее мы уничтожаем диалог за его ненадобностью. Выше приведенный код самостоятельно не открывает файл, функцию OpenFile, мы должны написать сами именно ей мы и будем передавать путь к файлу: Листинг: Наша процедура, которая открывает файл PHP код:
Эту функцию нужно глобально объявить void OpenFile(char *filename); и добавить дополнительные библиотеки, для ее корректной работы: stdio.h, stdlib.h, string.h. После того как fgets копирует строку в переменную line. Мы вызываем функцию gtk_text_buffer_get_iter_at_line, она устанавливает позицию для вставки текста на строку с номером i (при первом проходе цикла, это 0). А первые два параметра это, наше текстовое поле (буфер) и итер (так называются адреса в буфере, в данном случае мы будем устанавливать адрес на i-тую строку). Затем мы непосредственно вставляем текст функцией gtk_text_buffer_insert, первый параметр которой, мы уже знаем, второй- это адрес (итер) начиная с которого мы будем вставлять текст (его мы установили предыдущей функцией), третий - строка для вставки, последний длина строки (-1 для не определенной длины). Код для кнопки «сохранить как» очень похож на код кнопки «открыть» потому мы пока перепрыгнем кнопку «сохранить», заранее объявим и создадим функцию SaveFile, void SaveFile(char *filename). Листинг: Наша процедура, сохранение файла PHP код:
Функция gtk_text_buffer_get_start_iter устанавливает итер в начало буфера, а функция gtk_text_buffer_get_end_iter в конец, для этого в обоих случаях функциям нужно передать указатель на буфер и указатель на заранее объявленные итеры. Функция gtk_text_buffer_get_text возвращает текст из буфера, при этом ей передается указатель на буфер, на итеры между которыми расположен забираемый текст и переменная или значение булева типа (TRUE, FALSE), оно говорит о том отображать ли в буфере скрытые символы или нет. Процедура для сохранения в файл готова, теперь напишем, обработчик для кнопки «сохранить как», вызывающий эту самую функцию, он практически идентичен обработчику для кнопки «открыть», потому я не буду на нем подробно останавливаться. Листинг: обработчик для кнопки «Сохранить как» PHP код:
Теперь вернемся к кнопке «сохранить», ее обработчик очень прост. PHP код:
PHP код:
PHP код:
PHP код:
PHP код:
PHP код:
Осталось тока отобразить окно диалога «о программе». Это проще чем переслать два байта: PHP код:
Библиотека Gtk очень мощный зверь (но не единственный), для изучения которого нужна не одна неделя и сегодняшний обзор лишь маленькая толика, не способная полностью открыть перед нами завесу, за которой возможно скрывается истинна. Множество приложений написанных для Linux используют эту библиотеку. Надеюсь, все усвоили, принципы работы с gtk. Главное понять, какие функции и в каком порядке нужно использовать, здесь буквально все программирование строиться на использование функций gtk. Потому совместно с ней, можно использовать множество языков программирования, а не только C, так что дерзайте, пробуйте, экспериментируйте. |
Последняя версия рассматриваемой в статье программы, с исходниками разумеется:
Автор: Kerny ОС: Linux, Windows Зависимости: gtk 2.0 Название: Маленький блокнот для Linux Сайт разработчика: http://kerny-auroras.blogspot.com http://s001.radikal.ru/i195/1002/22/758ad5eda2b0t.jpg Описание: В ОС Linux существует множество текстовых редакторов, но все они многофункциональные, тяжеловесные, иногда нужно сохранить текст, на время, что бы, например, потом вставить в строку поиска и т.п. Этот редактор практически аналогичен Блокноту в системе Windows и как раз подходит для такой задачи, хочу сказать что код полностью кроссплатформенный, его можно откомпилировать практически под любую систему. Файлы: GuiNotepad.xml - описание графического интерфейса программы Notepad.c - исходный код программы Notepad - откомпилированная версия программы readme.txt - этот файл Установка: Если файл Notepad не запускается, то нужно заново откомпилировать программы под вашу систему, делается это так: "gcc notepad.c -o notepad -export-dynamic `pkg-config --cflags --libs gtk+-2.0`" Для правильной компиляции нужна библиотека gtk 2.0. Лог: Версия 1.2 +Исправлен недочет с открытием файлов, характерный лишь для версии 1.1 +Исправлен недочет с дублированием последней строки Версия 1.1 + Исправленны критические ошибки, в частности "переполнение буфера" при чтение из файла + Исправленн ряд мелких недочетов, связанный с преобразованием типов + Полность переписан код для открытия файла Скачать |
| Время: 23:23 |