Чтение онлайн

ЖАНРЫ

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

Для экономии места мы не станем приводить полный текст приложения. Но, конечно, перед выводом диалогового окна необходимо выполнить обычную инициализацию.

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 — модифицированный вариант предыдущей, в ней демонстрируется применение получателей данных.

Листинг 12.11. Переключатели в FOX и получатели данных

require 'fox16'

include Fox

class RadioButtonHandlerWindow < FXMainWindow

 def initialize(app)

# Сначала вызвать инициализатор базового класса.

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

DECOR_TITLE | DECOR_CLOSE)

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

default_choice = 0

@choice = FXDataTarget.new{default_choice)

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

LAYOUT_SIDE_TOP |

FRAME_GROOVE |

LAYOUT_FILL_X)

choices.each_with_index do |choice, index|

FXRadioButton.new(group, choice,

@choice, FXDataTarget::ID_OPTION+index,

ICON_BEFORE_TEXT |

LAYOUT_SIDE_TOP)

end

 end

end

application = FXApp.new

main = RadioButtonHandlerWindow.new(application)

Поделиться с друзьями: