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:

Листинг 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

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату