В этом примере мы встречаем еще один тип сообщения —
SEL_UPDATE
. Такое сообщение позволяет сделать виджеты независимыми друг от друга и от кода приложения. Как видим, ни одна кнопка не подозревает о существовании другой. Первая кнопка обновляет состояние второй, посылая сообщение обработчикам, которые отвечают за изменение состояния.
12.3.4. Текстовые поля
FOX располагает полезными средствами для ввода текста. В следующем примере демонстрируется применение класса
FXTextField
для редактирования одной строки. Параметры определяют формат текста. Значение
TEXTFIELD_PASSWD
скрывает текст, являющийся паролем,
TEXTFIELD_REAL
позволяет вводить только действительные числа в научной нотации, a
TEXTFIELD_INTEGER
— только целые числа.
simple = FXTextField.new(main, 20, nil, 0,
JUSTIFY_RIGHT|FRAME_SUNKEN|
FRAME_THICK|LAYOUT_SIDE_TOP)
simple.text = "Simple Text Field"
passwd = FXTextField.new(main, 20, nil, 0,
JUSTIFY_RIGHT|TEXTFIELD_PASSWD|
FRAME_SUNKEN|FRAME_THICK|
LAYOUT_SIDE_TOP)
passwd.text = "Password"
real = FXTextField.new(main, 20, nil, 0,
TEXTFIELD_REAL|FRAME_SUNKEN|
FRAME_THICK|LAYOUT_SIDE_TOP|
LAYOUT_FIX_HEIGHT, 0, 0, 0, 30)
real.text = "1.0E+3"
int = FXTextField.new(main, 20, nil, 0, TEXTFIELD_INTEGER|
FRAME_SUNKEN|FRAME_THICK|
LAYOUT_SIDE_TOP|LAYOUT_FIX_HEIGHT,
0, 0, 0, 30)
int.text = "1000"
Ниже показан простой способ ввода текста с помощью диалогового окна. В зависимости от выбранного метода можно будет вводить любой текст, только действительные или только целые числа.
puts FXInputDialog.getString("initial text",
self, "Диалог
для ввода текст",
"Введите текст:", nil)
puts FXInputDialog.getInteger(1200, self,
"Диалог для ввода целого числа",
"Введите целое число:", nil)
puts FXInputDialog.getReal(1.03е7, self,
"Диалог для ввода числа в научной нотации",
"Введите действительное число:", nil)
Для экономии места мы не станем приводить полный текст приложения. Но, конечно, перед выводом диалогового окна необходимо выполнить обычную инициализацию.
12.3.5. Прочие виджеты
В следующем примере демонстрируется использование меню и полос меню в приложениях. Отметим, что объекты
FXMenuCommand
следуют общей для FOX парадигме сообщение/получатель, с которой мы уже сталкивались при работе с кнопками:
require 'fox16'
include Fox
application = FXApp.new
main = FXMainWindow.new(application, "Simple Menu")
полоса меню размещается в верхней части родительского окна и простирается от левой до правой границы. Текст команды меню
"&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 классу.