Что такое gtk windows

Что такое gtk windows

GTK является одной из распространенных библиотек оконных элементов системы X Window. Немного поясню. Если Вы раньше программировали только в Windows, то можете быть удивлены абсолютно различным видом и поведением программ. В некотором смысле в Windows как то проще — все выглядит приблизительно одинаково. Это связано с тем, что среда X Window реализует только базовые примитивы управления окнами и графикой. Все остальное должно быть реализовано собственно программистом, Хотя, конечно, можно и в виндах устроить все по своему, написать оригинальный интерфейс и проч. Однако редкий программист долетит до середины Днепра (в основном программисты вообще летать не умеют :)).

Все это привело к созданию библиотек графических интерфейсов. На самом деле, чем разрабатывать всю оконную дребедень самому, гораздо легче воспользоваться уже готовыми инструментами. Тем более, как это сейчас любят говорить — «проприетарный подход не обеспечивает должной надежности, скорости и функциональности». Во как!

Еще я должен отметить, что использование таких библиотек, как GTK, обеспечивает возможность «интеграции рабочего стола». Ну, все видели Gnome (я надеюсь). там при изменении стиля меняется стиль всех элементов — прокруток, радиокнопок и т.д. и т.п. Красиво? Мне тоже кажется, что красиво. Правда, у всей этой красоты и иже с ней есть один маленький недостаток. У пользователя программы обязательно должны быть эти библиотеки. Чаще всего библиотеки ГТК есть, поскольку довольно много программ работают за счет них. Еще проблема совместимости. По идее, всегда должна быть обратная совместимость библиотек — старые приложения GTK должны работать с новыми, Запорожец должен работать на АИ-91. Но не всегда. Правда, лично я не разу не сталкивался с тем, что (тьфу-тьфу-тьфу :)) у меня не работали бы старые программы Гнома. Чаще всего программа, даже если она новее чем система, будет работать.

На мой взгляд, хуже дела обстоят с Qt. Я уже как-то где-то об этом говорил. Не так давно загружал Оперу, по-моему, первый нормальный графический браузер для Линукса. Там, кажется, три мега самой Оперы, все остальное — Qt. Это все остальное заняло 11 мегов. На поганом диалапе. Ну хватит о грустном :). Поэтому я тут про GTK и пишу.

Ой-ей-ей. Совсем забыл то, что в таких случаях пишут. Историю! Титры как бы. Во-первых, ГеТеКа расшифровывается как ГИМП Тулкит, то бишь набор инструментов ГИМПа. Кто-нить знает этого ГИМПа? GNU Image Manipulation Program. В среде Линукса на него молиться можно. Серьезнее говоря — ГИМП — очень мощная графическая программа. В некотором роде аналог Фотошопа, и — меня не слышат фанатики? — одно из очень немногих офисных приложений, которые могут сравниться по мощности с соответствующими программами Windows. Просьба камнями не кидаться и отметить, что я говорил именно про графические программы.

Руководство GTK# для начинающих

Оглавление

1. Предисловие

Эта статья является руководством для начинающих GTK# программистов. Она поможет тем, кто никогда до этого не программировал графические пользовательские интрфейсы (далее GUI) при помощи GTK#. Программисты ранее знакомые с GTK+ API из опыта написания на других языках (C, C++, Perl, Python) так же найдут этот пассаж полезным, т.к. он объясняет основы процесса создания приложений на C# в среде Mono. Эта статья так же рассказывает об основах использования Glade и libglade как быстрого инструмента создания графического пользовательского интерфейса.

Читайте также:  Линукс настройка для сервера

1.1 Что такое GTK#?

Проще говоря, gtk# — это обертка над gtk+, кроссплатформенным GUI фреймворком.

gtk+ — это мультиплатформенный тулкит для создания GUI. Предоставляя полный набор виждетов, gtk+ пригоден в различных проектах: от одноразовых игрушек до набора приложений уровня предприятия.

Сегодня gtk+ работает с любым X сервером, Direct Framebuffer’ом и производными в Microsoft Windows NT. Библиотека gtk+ известна от Linux, где она является базисом для построения виджетов рабочей среды GNOME. gtk+ включен практически во все дистрибутивы Linux, и стабильно работает под управлением Windows NT. (в 2000 работала нестабильно, если мне память не изменяет)

Портирование gtk+ на Mac OS X запланированно, но необходима заинтересованность других людей. Это зов к участию.

Одно из наиболее распространенных недоумений состоит в том, что GTK# требует Mono для работы. Это неверно. GTK# будет запускаться на любой .NET-совместимой среде. GTK# регулярно тестируется в MS .NET и Mono фреймворках, но также может быть запущена в любой полностью совместной среде. Это означает, что если Вы пишите приложение на GTK# и хотите запустить его в Windows, Вы можете развернуть проект только с GTK# с использованием среды MS, или развернуть его в среде Mono для Windows.

2. Установка

2.1 Скачивание/Установка

Первую вещь, которую необходимо сделать — это скачать GTK# и установить его.

Linux, MacOSX, FreeBSD и другие: Проверьте наличие требуемых пакетов gtk-sharp, mono в вашем дистрибутиве.

aptitude install mono gtk-sharp2

для Debian-based дистрибутивов.
В SuSE Linux выберите нужные пакеты в YaST. Если их нет в дистрибутиве, тогда ищите здесь(http://www.mono-project.com/Downloads) и загружайте. Если на mono-project.com нет пакетов для Вашей платформы, тогда Вам придется скомпилировать из исходников 😉

Windows: программируйте Windows.Forms, не хрен лезть в GTK =) [примечание автора]

2.2 Внутри библиотек GTK#

Компоненты GTK#
GTK# состоит из следующих сборок, каждая соответствует подобной библиотеке:

gtk-sharp (http://www.mono-project.com/monodoc/N:Gtk)
Связи тулкита gtk+ 2.x для создания GUI

glib-sharp (http://www.mono-project.com/monodoc/N:Glib)
Связи тулкита glib 2.x, которые обеспечивают низкоуровневое библиотеки ядра для gtk+ (не-GUI)

pango-sharp (http://www.mono-project.com/monodoc/N:Pango)
Связи Pango, высокоуровневая библиотека компоновки и рендеринга международных текстов

atk-sharp (http://www.mono-project.com/monodoc/N:Atk)
связи к atk фреймворку

gdk-sharp (http://www.mono-project.com/monodoc/N:Gdk)
низкоуровневый инструментарий для «рисования», используемый gtk+

glade-sharp (http://www.mono-project.com/monodoc/N:Glade)
Glade# позволяет Вам загружать интерфейсы Glade в программу. Это наиболее простой путь создания GTK# GUI.

art-sharp (http://www.mono-project.com/monodoc/N:Art)
библиотека для работы с векторной графикой и отрисовки

rsvg-sharp (http://www.mono-project.com/monodoc/N:Rsvg) библиотека отрисовки SVG

gtk-dotnet (http://www.mono-project.com/monodoc/N:Gtk.DotNet)
интеграция пространства имен Gtk# с System.Drawing

gnomevfs-sharp (http://www.mono-project.com/monodoc/N:GnomeVfs)
связи файлов, их MIME типов, изображений к методу обращения приложений GNOME’а к файловой системе

vte-sharp (http://www.mono-project.com/monodoc/N:Vte)
связи к терминальному эмулятору VTE

gconf-sharp (http://www.mono-project.com/monodoc/N:GConf)

Связи к системе хранения конфигураций в GNOME

gtkhtml-sharp (http://www.mono-project.com/monodoc/T:Gtk.HTML)
Связи к легковесному HTML виджету

Другие компоненты не включены в основной дистрибутив GTK#, но заслуживают упоминания, потому что имеют отношение к GTK#: Gecko#, Gtksourceview#, Gsf#, Guile#, Gst# и dbus#.

2.3 GTK# или Glade#

Когда люди начинают изучение Mono, они могут стоять на перепутье — какую библиотеку использовать: gtk# или glade#. Для этого Вам нужно понять что такое glade# и что такое gtk#. gtk# — это ядро для построения оконных и виджет систем. Glade# наследует GTK#, таким образом является подмножеством GTK# и является совместимой, но glade# автоматически компонует виджеты с сохраняет их как XML файл. XML компоновка GUI может быть сгенерирована при помощи Glade утилиты, студии дизайна WYSIWYG.

Для большинства окон Glade# — лучший выбор. Он экономит время за счет отсутствия необходимости написания программного кода для GUI и делает простым изменение интерфейса в будущем. Но возникает проблема в том, что Вам нужно от интерфейса, Glade# не может выполнять некоторые специфичные вещи (скрывать элементы, динамически загружать новые части, наследовать виджеты). Только опыт может Вам понять, что в конкретном случае лучше использовать.

Читайте также:  Linux мы windows background

Для быстрого ознакомления с Glade# Вы возможно захотете взглянуть на этот скринкаст(http://nat.org/demos/gtksharp.html) Ната Фридмана (Nat Friedman)(http://nat.org), в котором он создает простое графическое приложение всего за несколько минут.

3. Первое GTK# приложение

Шаг 1. Присядьте удобнее

Шаг 2. Создание папок и файлов

Для начала нам нужно создать новую директорию для маленького проекта. (Пользователи Windows: давайте не будем использовать пробелы в названии директории, чтобы избежать в дальнейшем головной боли).

Откройте shell (Если вы в Windows, откройте меню сПуск 🙂 далее Программы -> Mono 1.x.x -> Mono Command Prompt. Она автоматически установит нужные пути к mono библиотекам.) Перейдите в только что созданную директорию. Мы часто будем использовать консоль, поэтому оставьте ее запущенной.

Вернемся к делу. Откройте свой любимый редактор (MonoDevelop, vi, emacs, notepad и т.д.) и создайте новый пустой проект (если это возможно) или создайте новый пустой файл. Сохраните файл под именем «helloworld.cs».

Шаг 3. Формирование кода

Я надеюсь, что Вы уже знакомы с C#, и код написанный ниже не вызовет никаких проблем в понимании. Мы должны создать новый класс, использовать Gtk# и указать точку входа в нашу программу. Это будет выглядеть так:

Это должно выглядеть весьма знакомо для Вас. Только теперь мы можем воспользоваться компилятором. Сохраним исходный код, перейдем в консоль и построим проект:

Для тех кто пользовался csc компилятором в Windows параметр «-pkg:» может показаться незнакомым. Этого параметра не было в csc, потому что Mono пришел из мира Linux. Этот параметр позволяет указать на необходимость подключения пакета gtk-sharp-2.0. Т.е. система ищет файл «gtk-sharp-2.0.pc», который содержит данные о местоположении библиотеки для этого пакета (среди другой информации). Т.е. мы не должны вводить «-r:gtk-sharp-2.0.dll -r:atk-sharp-2.0.dll -r:pango-sharp-2.0.dll . » руками.

Шаг 4. Добавление графического интерфейса GUI

Теперь давайте вернемся обратно к нашему коду. Уберем оператор «Console.WriteLine». Первое, что мы сделаем — создадим новое окно. Проделаем это добавлением нового оператора new Window и блока приложения (для начала нити цикла main). Вот так:

Теперь скомпилируем исходный код так же как мы делали это раньше, и запустим программу

В итоге вы получите что-то вроде этого:

Не так уж и сложно, да?

Первая вещь, которую Вы могли заметить, это то, что в отличии от использования System.Windows.Forms мы не писали код для точной компоновки текста в окне. Например, мы не писали ‘myLabel.Left = 100’ или ‘myLabel.Width = 200’ или что-то подобное для размещения текстовой метки на форме, мы просто пишем ‘myWin.Add(. )’. И все это потому, что ‘Gtk.Window’ — это виджет, который наследуется от Bin, или одиночного виджета который размещен в контейнере Container.

Другая часть кода, которая могла Вас заинтересовать, это использование выражений «Application.Init()» и «Application.Run()». Если вы когда-либо ранее использовали System.Windows.Forms это аналогично использованию «Application.Run()» во многих случаях. Обычно, когда приложения заканчивает обработку любого кода в основном потоке, приложение останавливается. Команда «ShowAll()» не блокирует код и продолжает дальнейшее выполнение кода (вплоть до остановки). Команда «Application.Init()» говорит оболочке выполнения «слушать» сигналы поступающие от Gtk.Windows и в момент когда выполняется «Application.Run()» выполнение кода передается основному циклу сообщений. Это позволяет оставаться приложению запущенным до тех пор пока не будут закрыты все окна. Для большей информации смотрите информацию об объекте Application.

Шаг 5. Формирование окна

Возможно Вы захотите спросить себя «Как я смогу добавить новый виджет на окно, если оно может содержать только один виджет?» До этого мы говорили, что Window действительно может содержать в себе только один виджет, но виджет сам по себе может содержать в себе множество других виджетов. Некоторые из этих виджетов наследуются от контейнера Gtk.Box, а в некоторых случаях напрямую от контейнера. Контейнерный виджет Bin наследуется напрямую от виждета-контейнера, как и многие другие виджеты, но Bin может содержать в себе только один элемент управления.

Читайте также:  Сетевые параметры операционной системы windows

Для того чтобы размещать большое количество виджетов в нашем окне, мы должны добавить на окно один из виджетов, который может содержать в себе другие виджеты. Существует множество виджетов, которые могут делать это, но мы затронем только некоторые простые: HBox(http://www.go-mono.com/docs/index.aspx?link=T%3aGtk.HBox), VBox(http://www.go-mono.com/docs/index.aspx?link=T%3aGtk.VBox) и возможно Table(http://www.go-mono.com/docs/index.aspx?link=T%3aGtk.Table).

Шаг 6. Добавление событий

Все классы производные от ‘Widget (http://www.go-mono.com/docs/index.aspx?link=T%3aGtk.Box)’ предоставляют следующие события:

  • ButtonPressEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.ButtonPressEvent)
  • ButtonReleaseEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.ButtonReleaseEvent)
  • ScrollEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.ScrollEvent)
  • MotionNotifyEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.MotionNotifyEvent)
  • DeleteEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.DeleteEvent)
  • DestroyEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.DestroyEvent)
  • ExposeEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.ExposeEvent)
  • KeyPressEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.KeyPressEvent)
  • KeyReleaseEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.KeyReleaseEvent)
  • EnterNotifyEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.EnterNotifyEvent)
  • LeaveNotifyEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.LeaveNotifyEvent)
  • ConfigureEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.ConfigureEvent)
  • FocusInEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.FocusInEvent)
  • FocusOutEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.FocusOutEvent)
  • MapEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.MapEvent)
  • UnmapEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.UnmapEvent)
  • PropertyNotifyEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.PropertyNotifyEvent)
  • SelectionClearEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.SelectionClearEvent)
  • SelectionRequestEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.SelectionRequestEvent)
  • SelectionNotifyEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.SelectionNotifyEvent)
  • ProximityInEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.ProximityInEvent)
  • ProximityOutEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.ProximityOutEvent)
  • VisibilityNotifyEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.VisibilityNotifyEvent)
  • ClientEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.ClientEvent)
  • NoExposeEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.NoExposeEvent)
  • WindowStateEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.WindowStateEvent)

Многие их этих событий могут быть обработаны стандартным обработчиком событий. Например:

public static void HandlerMethod(object obj, EventArgs args)

Пример обработки событий нажатия на кнопку:

public static void ButtonPressHandler(object obj, ButtonPressEventArgs args)

ButtonPressEventArgs — это класс производный от EventArgs. Класс ButtonPressEventArgs, как и многие другие в gtk#, добавляет свойство Gtk.Event (или другое от Gtk.Event) к EventArgs.

  • EventType.Nothing
  • EventType.Delete
  • EventType.Destroy
  • EventType.Expose
  • EventType.MotionNotify
  • EventType.ButtonPress
  • EventType.TwoButtonPress
  • EventType.ThreeButtonPress
  • EventType.ButtonRelease
  • EventType.KeyPress
  • EventType.KeyRelease
  • EventType.EnterNotify
  • EventType.LeaveNotify
  • EventType.FocusChange
  • EventType.Configure
  • EventType.Map
  • EventType.Unmap
  • EventType.PropertyNotify
  • EventType.SelectionClear
  • EventType.SelectionRequest
  • EventType.SelectionNotify
  • EventType.ProximityIn
  • EventType.ProximityOut
  • EventType.DragEnter
  • EventType.DragLeave
  • EventType.DragMotion
  • EventType.DragStatus
  • EventType.DropStart
  • EventType.DropFinished
  • EventType.ClientEvent
  • EventType.VisibilityNotify
  • EventType.NoExpose
  • EventType.Scroll
  • EventType.WindowState
  • EventType.Setting

Например, для использования события Gdk.Event мы можем использовать такой код:

В примере выше вы можете увидеть как обнаружить было ли одиночное нажатие мышкой или это был двойной клик.

4. Первое Glade# приложение

Шаг 1. Что такое Glade#

4.1.1 Что такое glade файлы?

4.1.2 На что похожи файлы .glade?

Файл .glade содержит в себе всю необходимую информацию для того, чтобы библиотека libglade могла воссоздать GUI.

Шаг 2. Интеграция glade файлов с нашей программой

В намерениях нашего примера мы предпологаем, что GUI был сохранен в файл gui.glade, который содержит описание окна window1, кнопки button1 и метки label1.

Нам нужно будет создать новый указатель на Gtk# и Glade#, а затем создать новый класс и точку входа, с которой начинается наша программа.

4.2.1 Как скомпилировать?

Теперь мы должны скомпилировать исходный файл glade.cs указывая пространство имен для glade, которое находится в библиотеке glade-sharp. Команда компиляции следующая:

$ mcs -pkg:glade-sharp -resource:gui.glade glade.cs

Коммандой mcs -pkg:glade-sharp мы создаем программу glade.exe, а опция -resource внедряет файл gui.glade в исполняемую программу.

Передавая null как первый параметр в конструктор Glade.XML, мы сообщаем библиотеке libglade загружать glade файл из ресурсов, как вариант использования конструктора, файл может быть загружен из файловой системы, что особенно полезно тогда, когда Вы не хотите перекомпилировать GUI приложение после каждого изменения .glade файла.

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

Шаг 3. Как использовать Glade# в моем коде

4.4 Как обращаться к виджетам определенным в gui.glade

Для доступа к объектам, определенным в gui.glade файле, Вы должны знать имя объекта и его тип, и только тогда добавлять его в C# код. Делается это следующим образом (обратите внимание на оттрибут [Widget]):

Применяем это определение к нашему примеру как следует ниже в коде:

4.5 Как добавить событие

Для добавления событий Вам необходимо следовать примеру кода ниже. Вы также можете добавлять события из Glade.

Оцените статью