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

12.3.3. Кнопки

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
 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. Такое сообщение позволяет сделать виджеты независимыми друг от друга и от кода приложения. Как видим, ни одна кнопка не подозревает о существовании другой. Первая кнопка обновляет состояние второй, посылая сообщение обработчикам, которые отвечают за изменение состояния.

Оглавление книги


Генерация: 0.061. Запросов К БД/Cache: 0 / 2
поделиться
Вверх Вниз