В следующей строчке показано, как с помощью метода 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
(раскрыть окно на весь экран).
Вы уже видели, как организуется работа с кнопками в 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
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
. Такое сообщение позволяет сделать виджеты независимыми друг от друга и от кода приложения. Как видим, ни одна кнопка не подозревает о существовании другой. Первая кнопка обновляет состояние второй, посылая сообщение обработчикам, которые отвечают за изменение состояния.
FOX располагает полезными средствами для ввода текста. В следующем примере демонстрируется применение класса FXTextField
для редактирования одной строки. Параметры определяют формат текста. Значение TEXTFIELD_PASSWD
скрывает текст, являющийся паролем, TEXTFIELD_REAL
позволяет вводить только действительные числа в научной нотации, a TEXTFIELD_INTEGER
— только целые числа.
simple = FXTextField.new(main, 20, nil, 0,
JUSTIFY_RIGHT|FRAME_SUNKEN|
FRAME_THICK|LAYOUT_SIDE_TOP)
simple.text = "Simple Text Field"
passwd = FXTextField.new(main, 20, nil, 0,
JUSTIFY_RIGHT|TEXTFIELD_PASSWD|
FRAME_SUNKEN|FRAME_THICK|
LAYOUT_SIDE_TOP)
passwd.text = "Password"
real = FXTextField.new(main, 20, nil, 0,
TEXTFIELD_REAL|FRAME_SUNKEN|
FRAME_THICK|LAYOUT_SIDE_TOP|
LAYOUT_FIX_HEIGHT, 0, 0, 0, 30)
real.text = "1.0E+3"
int = FXTextField.new(main, 20, nil, 0, TEXTFIELD_INTEGER|
FRAME_SUNKEN|FRAME_THICK|
LAYOUT_SIDE_TOP|LAYOUT_FIX_HEIGHT,
Читать дальше
Конец ознакомительного отрывка
Купить книгу