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

12.3.5. Прочие виджеты

В следующем примере демонстрируется использование меню и полос меню в приложениях. Отметим, что объекты FXMenuCommand следуют общей для FOX парадигме сообщение/получатель, с которой мы уже сталкивались при работе с кнопками:

require 'fox16'

include Fox

application = FXApp.new

main = FXMainWindow.new(application, "Simple Menu")

menubar = FXMenuBar.new(main, LAYOUT_SIDE_TOP |

 LAYOUT_FILL_X)

filemenu = FXMenuPane.new(main)

quit_cmd = FXMenuCommand.new(filemenu, "&Quit\tCtl-Q")

quit_cmd.connect(SEL_COMMAND) { application.exit }

FXMenuTitie.new(menubar, "&File", nil, filemenu)

application.create

main.show(PLACEMENT_SCREEN)

application.run

Здесь и FXMenuBar, и FXMenuPane добавляются непосредственно в главное окно FXMainWindow. Благодаря параметрам LAYOUT_SIDE_TOP и LAYOUT_FILL_X полоса меню размещается в верхней части родительского окна и простирается от левой до правой границы. Текст команды меню "&Quit\tCtl-Q" подразумевает, что комбинация клавиш Alt+Q играет роль «горячей клавиши», a Ctrl+Q — клавиши быстрого выбора пункта меню. Последовательное нажатие Alt+F и Alt+Q эквивалентно щелчку по меню File с последующим выбором пункта Quit. Нажатие Ctrl+Q заменяет всю последовательность.

В классе FXTopWindow есть метод для свертывания главного окна. Следующие три строчки добавляют в меню File команду, которая свернет окно:

FXMenuCommand.new(filemenu, "&Icon\tCtl-I") do |cmd|

cmd.connect(SEL_COMMAND) { main.minimize } end

На этом примере мы видим еще один прием, полезный при конструировании команды меню. Если вам не нужна ссылка на виджет, представляющий команду меню, то можно просто присоединить блок к вызову FXMenuCommand.new и выполнить всю инициализацию виджета внутри блока. Разумеется, этот прием применим к любому встроенному в FOX классу.

В листинге 12.10 демонстрируются переключатели.

Листинг 12.10. Переключатели в fox

require 'fox16'

include Fox

class RadioButtonHandlerWindow < FXMainWindow

 def initialize(app)

  # Invoke base class initialize first

  super(app, "Radio Button Handler", nil, nil,

   DECOR_TITLE | DECOR_CLOSE)

  choices = [ "Good", "Better", "Best" ]

  group = FXGroupBox.new(self, "Radio Test Group",

   LAYOUT_SIDE_TOP |

   FRAME_GROOVE |

   LAYOUT_FILL_X)

  choices.each do |choice|

   FXRadioButton.new(group, choice,

    nil, 0,

    ICON_BEFORE_TEXT |

    LAYOUT_SIDE_TOP)

  end

 end

end

application = FXApp.new

main = RadioButtonHandlerWindow.new(application)

application.create

main.show(PLACEMENT_SCREEN)

application.run

Группы переключателей — стандартное средство в графических приложениях, предназначенное для выбора одного из взаимно исключающих вариантов. В данном примере варианты представлены массивом из трех строк:

choices = [ "Good", "Better", "Best" ]

В главное окно добавляется объект FXGroupBox, который визуально указывает, что три переключателя взаимосвязаны, а затем в этот контейнер добавляются сами переключатели (по одному на каждый вариант). Но сам контейнер FXGroupBox ничего не делает для того, чтобы обеспечить взаимное исключение. Если запустить пример в таком виде, то вы сможете выбрать более одного переключателя.

Есть несколько способов обеспечить ожидаемое поведение переключателей, но в приложениях FOX чаще всего для этой цели используют получатель данных — класс FXDataTarget. Это специальный объект, играющий роль хранителя какого-то значения. Как и любой другой объект в FOX, FXDataTarget может посылать и получать сообщения.

Программа в листинге 12.11 — модифицированный вариант предыдущей, в ней демонстрируется применение получателей данных.