Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

button.connect(SEL_COMMAND) { application.exit }

application.create

main.show(PLACEMENT_SCREEN)

application.run

Этого примера достаточно для демонстрации двух важнейших классов FXRuby:

FXApp
и
FXMainWindow
. Приложение должно в самом начале создать и инициализировать объект
FXApp. FXMainWindow
— подкласс
FXTopWindow
; каждый виджет в FOX — некая разновидность «окна». Класс
FXTopWindow
представляет окно верхнего уровня, которое появляется непосредственно на экране. Более сложное приложение FXRuby обычно создает подкласс
FXMainWindow
и размещает в нем виджеты на этапе инициализации.

Конструктору

FXMainWindow
необходимо передать первым параметром объект FXApp. Второй параметр — заголовок окна. По умолчанию экземпляр
FXMainWindow
размещается в центре экрана и снабжается всеми стандартными элементами, присущими
FXTopWindow
. Таким образом, для окна отображается полоса заголовка с кнопками свертывания, развертывания и закрытия. Его размеры можно изменять.

Атрибут

decorations
главного окна позволяет явно указать необходимые элементы оформления. Например, можно запретить изменение размеров:

main = FXMainWindow.new(application, "Today's Date")

main.decorations = DECOR_TITLE | DECOR_CLOSE

Значение

decorations
образуется комбинированием битовых флагов, как это принято в C++. В примере выше окно имеет только заголовок и кнопку закрытия.

В этом простом примере главное окно содержит всего один виджет — экземпляр класса

FXButton
, в котором отображается текущая дата.

str = Time.now.strftime("&Today is %B %d, %Y")

button = FXButton.new(main, str)

Первый аргумент конструктора

FXButton
— родительское окно, содержащее данный виджет. В нашем примере это главное окно. Второй аргумент — текст, рисуемый на кнопке.

В следующей строчке показано, как с помощью метода

connect
ассоциировать с кнопкой блок:

button.connect(SEL_COMMAND) { application.exit }

Здесь говорится, что когда кнопка отправляет командное сообщение (то есть сообщение типа

SEL_COMMAND
), следует вызвать метод
exit
.

В оставшихся строчках мы наблюдаем «ритуал обручения» объектов

FXApp
и
FXMainWindow
:

application.create

main.show(PLACEMENT_SCREEN)

application.run

Любое приложение FXRuby должно включать подобные строки, чтобы создать экземпляр приложения, показать окно

FXMainWindow
и запустить цикл обработки событий. Аргумент
PLACEMENT_SCREEN
метода
show
определяет, в каком месте экрана должно появиться окно. Из других возможных значений упомянем
PLACEMENT_CURSOR
(поместить окно там, где находится курсор),
PLACEMENT_OWNER
(в центре окна-владельца) и
PLACEMENT_MAXIMIZED
(раскрыть
окно на весь экран).

12.3.3. Кнопки

Вы уже видели, как организуется работа с кнопками в FXRuby. Заглянем немного глубже.

На кнопке может размещаться не только короткая строка. Допустимы и несколько строк, разделенных символом новой строки:

text = "&Hello, World!\n" +

 "Do you see multiple lines of text?"

FXButton.new(self, text)

Обратите внимание на амперсанд перед буквой H в строке

"Hello, World!"
. Он задает «горячую клавишу», нажатие которой эквивалентно щелчку по кнопке.

На кнопке может быть также нарисовано изображение, заданное в разных форматах. Например:

text = "&Неllо, World!\n" +

 "Do you see the icon?\n" +

 "Do you see multiple lines of text?"

icon = File.open("some_icon.gif", "rb") do |file|

 FXGIFIcon.new(app, file.read)

end

FXButton.new(self, text, icon)

В листинге 12.9 иллюстрируется механизм обновления состояния интерфейса, реализованный в FOX:

Листинг 12.9. Обновление состояния интерфейса в FOX

require 'fox16'

include Fox

class TwoButtonUpdateWindow < FXMainWindow

 def initialize(app)

# Сначала инициализируем базовый класс.

super(app, "Update Example", nil, nil,

DECOR_TITLE | DECOR_CLOSE)

# Первая кнопка:

@button_one = FXButton.new(self, "Enable Button 2")

@button_one_enabled = true

# Вторая кнопка:

@button_two = FXButton.new(self, "Enable Button 1")

@button_two.disable

@button_two_enabled = false

# Устанавливаем обработчики сообщений.

@button_one.connect(SEL_COMMAND, method(:onCommand))

@button_two.connect(SEL_COMMAND, method(:onCommand))

@button_one.connect(SEL_UPDATE, method(:onUpdate))

@button_two.connect(SEL_UPDATE, method(:onUpdate))

 end

 def onCommand(sender, sel, ptr)

# Обновить состояние приложения.

@button_one_enabled = !@button_one_enabled

@button_two_enabled = !@button_two_enabled

Поделиться:
Популярные книги

Эммануэль

Арсан Эммануэль
1. Эммануэль
Любовные романы:
эро литература
7.38
рейтинг книги
Эммануэль

Спасите меня, Кацураги-сан! Том 4

Аржанов Алексей
4. Токийский лекарь
Фантастика:
городское фэнтези
попаданцы
дорама
фэнтези
5.00
рейтинг книги
Спасите меня, Кацураги-сан! Том 4

Черный Маг Императора 17

Герда Александр
17. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Черный Маг Императора 17

Старая школа рул

Ромов Дмитрий
1. Второгодка
Фантастика:
альтернативная история
6.00
рейтинг книги
Старая школа рул

Имя нам Легион. Том 10

Дорничев Дмитрий
10. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 10

Газлайтер. Том 16

Володин Григорий Григорьевич
16. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 16

Законник Российской Империи. Том 3

Ткачев Андрей Юрьевич
3. Словом и делом
Фантастика:
городское фэнтези
альтернативная история
аниме
дорама
5.00
рейтинг книги
Законник Российской Империи. Том 3

Барон не играет по правилам

Ренгач Евгений
1. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон не играет по правилам

Виктор Глухов агент Ада. Компиляция. Книги 1-15

Сухинин Владимир Александрович
Виктор Глухов агент Ада
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Виктор Глухов агент Ада. Компиляция. Книги 1-15

Бояръ-Аниме. Газлайтер. Том 35

Володин Григорий Григорьевич
35. История Телепата
Фантастика:
аниме
боевая фантастика
фэнтези
5.00
рейтинг книги
Бояръ-Аниме. Газлайтер. Том 35

Индульгенция 2. Без права на жизнь

Машуков Тимур
2. Темный сказ
Фантастика:
аниме
фэнтези
попаданцы
гаремник
5.00
рейтинг книги
Индульгенция 2. Без права на жизнь

Черный дембель. Часть 3

Федин Андрей Анатольевич
3. Черный дембель
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Черный дембель. Часть 3

Бояръ-Аниме. Газлайтер. Том 30

Володин Григорий Григорьевич
30. История Телепата
Фантастика:
альтернативная история
аниме
фэнтези
5.00
рейтинг книги
Бояръ-Аниме. Газлайтер. Том 30

Император Пограничья 1

Астахов Евгений Евгеньевич
1. Император Пограничья
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Император Пограничья 1