Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на языке Ruby.docx
Скачиваний:
18
Добавлен:
06.09.2019
Размер:
1.74 Mб
Скачать

12.3.2. Простое оконное приложение

Вот пример минимального приложения FXRuby, которое делает то же самое, что рассмотренные выше приложения Tk и GTK+:

require 'fox16' # Используются привязки к FOX 1.6.

include Fox

application = FXApp.new

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

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

button = FXButton.new(main, str)

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: