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!
' +
'Do you see multiple lines of text?'
FXButton.new(self, text)
Обратите внимание на амперсанд перед буквой H в строке 'Hello, World!'
. Он задает «горячую клавишу», нажатие которой эквивалентно щелчку по кнопке.
На кнопке может быть также нарисовано изображение, заданное в разных форматах. Например:
text = '&Неllо, World!
' +
'Do you see the icon?
' +
'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:
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
end
def onUpdate(sender, sel, ptr)
# Обновить кнопки в зависимости от состояния приложения.
@button_one_enabled ?
@button_one.enable : @button_one.disable
@button_two_enabled ?
@button_two.enable : @button_two.disable
end
end
application = FXApp.new
main = TwoButtonUpdateWindow.new(application)
application.create
main.show(PLACEMENT_SCREEN)
application.run
Здесь в главное окно добавлено две кнопки. Мы снова воспользовались методом connect
, чтобы связать сообщение SEL_COMMAND
от кнопок с кодом, но на этот раз код представляет собой метод, а не блок:
@button_one.connect(SEL_COMMAND, method(:onCommand))
В этом примере мы встречаем еще один тип сообщения — SEL_UPDATE
. Такое сообщение позволяет сделать виджеты независимыми друг от друга и от кода приложения. Как видим, ни одна кнопка не подозревает о существовании другой. Первая кнопка обновляет состояние второй, посылая сообщение обработчикам, которые отвечают за изменение состояния.
12.3.4. Текстовые поля
FOX располагает полезными средствами для ввода текста. В следующем примере демонстрируется применение класса FXTextField
для редактирования одной строки. Параметры определяют формат текста. Значение TEXTFIELD_PASSWD
скрывает текст, являющийся паролем, TEXTFIELD_REAL
позволяет вводить только действительные числа в научной нотации, a