; при таком подходе класс может управлять собственным отображением и поведением (не заставляя вызывающую программу конфигурировать окно). Класс главного окна наследует
Gtk::window
.
Как и в примере «Текущая дата», обработчик сигнала destroy завершает цикл обработки событий после закрытия главного окна.
Этот класс создает однострочное поле ввода (класс
Gtk::Entry
) и кнопку
Gtk::Button
с текстом
All Caps!
. С кнопкой связан обработчик события
clicked
, которое генерируется, когда пользователь нажимает и отпускает кнопку мыши, в то время как ее указатель находится над кнопкой.
Класс
Gtk::Window
— производный от
Gtk::Bin
, поэтому может содержать только один дочерний виджет. Чтобы добавить в окно два виджета, мы сначала помещаем их в контейнер
HBox
, который, в свою очередь, делаем потомком главного окна. Виджеты, добавляемые в контейнер
Gtk::НВох
, по умолчанию размещаются начиная с его правой границы. Есть также контейнер
Gtk::VBox
, который упаковывает своих потомков по вертикали.
Как и раньше, чтобы главное окно (и все его потомки) стало видимым, необходимо вызвать метод
show_all
.
Обработчик события
clicked
вызывается при нажатии кнопки. Он получает текст, находящийся в поле ввода, преобразует его в верхний регистр и записывает обратно в поле ввода.
Собственно код приложения находится после определения класса
SampleWindow
. В нем всего лишь создается главное окно и запускается цикл обработки событий.
12.2.4. Текстовые поля
В библиотеке GTK+ есть класс
Gtk::Entry
для ввода одной строки текста — мы видели его в предыдущем примере. Существует также класс
Gtk::Textview
, представляющий собой мощный многострочный редактор; его мы и опишем.
Программа в листинге 12.6 создает многострочное текстовое поле и помещает в него текст. По мере изменения содержимого поля текущая длина текста отображается с помощью метки, расположенной в нижней части окна (рис. 12.5).
Структура программы такая же, как в примере с кнопкой: инициализировать Ruby/GTK2, определить класс главного окна, задать обработчик события, корректно завершающий приложение, и установить начальный размер окна. После
initialize
вызывается метод
show_all
, который делает окно видимым. В последних двух строчках создается окно и запускается цикл обработки событий.
Мы создали виджет редактора с именем
@text
. Включен режим переноса строк, по умолчанию строки разрываются без учета границы слов.
Переменная
@buffer
— это текстовый буфер для виджета
@text
. Мы установили обработчик события
changed
; он будет вызываться при вставке, удалении и изменении текста. Обработчик пользуется методом
char_count
, чтобы узнать текущую длину текста в редакторе и преобразовать ее в строку сообщения. Предложение
@status.text=text
отображает это сообщение в окне.
Далее мы конфигурируем виджет
@text
так, чтобы он показывал текст другим стилем. Для этого с помощью метода
create_tag
создается тег «notice», с которым связан шрифт «Times Bold Italic 18» и красный цвет. Класс
Gtk::TextTag
позволяет задавать и другие свойства тегов.
В данном случае мы хотим воспользоваться шрифтом из семейства Times; на платформе Windows мы, скорее всего, получим какой-то вариант шрифта Times Roman. В ОС Linux/UNIX параметром должна быть стандартная для X Window System строка указания шрифта. Система вернет шрифт, наиболее близкий к заданному.
Метка
@status
первоначально пуста. Ее текст будет изменен позже.
GTK+ предлагает два способа добавить полосы прокрутки. Можно напрямую создать объект
Gtk::ScrollBar
и с помощью сигналов синхронизировать его с ассоциированным виджетом. Но в большинстве случаев проще воспользоваться виджетом