Все элементы управления разделяют приведенные ниже свойства. Впрочем, для конкретного элемента не каждое свойство имеет смысл. Например, строки статуса не могут быть выравнены, поэтому -align к ним неприменимо.
-fontШрифт надписей элемента. Шрифты создаются с помощью слова create-font.
-alignВыравнивание надписи в пределах элементах. Могут устанавливаться следующие константы: left - влево, center - по центру, right - вправо.
-commandСлово, которое будет выполнено при поступлении "главной" команды. Главная команда различается для каждого элемента. Для кнопок - это нажатие на кнопку, для строки статуса - щелчок по ней и т.д. По умолчанию NOOP.
![]() | Кстати будет заметить, что Windows очень болезненно относится к своему стеку. Поэтому во всех обработчиках типа -command, -painter и иже с ними, вызываемых из оконной процедуры, стек нужно обязательно оставлять в том же состоянии, в каком он был при вызове. Иначе ждите GPF, а то и полного зависания машины. |
Список (MESSAGES:...MESSAGES;) обработчиков уведомлений. Уведомления зависят от конкретного элемента. При запуске обработчика lparam указывает на первое слово после стандартного NMHDR, поскольку там находится обычно самое интересное. Обратите внимание: в этих обработчиках НЕ нужно ставить флажок, обработан элемент или нет, в отличие от обработчиков -pre и -wndproc.
-updownНекоторые элементы могут быть дополнены двумя стрелочками, так называемым спином. В этом свойстве хранится спин, если таковой имеется. Подробнее о спинах смотрите здесь.
-tooltipВсплывающая подсказка для элемента. Устанавливается и читается точно так же, как и свойство -text. Подробнее о подсказках смотрите здесь.
-painterПроцедура нестандартной отрисовки элементов (для элементов с флагом customdraw). При вызове переменная windc указывает контекст рисования, paint-rect на границы рисования. Остальные параметры доступны через lparam.
Добавить к окну строку статуса. Строка статуса при необходимости доступна через свойство -status окна.
split-status ( array no win -- )Разделить строку статуса на no частей. В массиве array содержатся no ячеек - правые границы каждой части (в пикселях) или -1, показывающая, что ячейка продолжается до конца строки статуса.
set-status ( z no win -- )Установить указанный текст в нужную часть статусной строки. Части нумеруются с нуля.
Горизонтальное и вертикальное расстояние от границы кнопки до надписи.
-imageКартинка (для соответствующих элементов - bitmap, bitmap-button).
-stateСостояние элемента управления.
Создать прямоугольник.
hline ( -- ctl )Создать горизонтальную линию.
filler ( -- ctl )Создать невидимый элемент - заполнитель места.
label ( z -- ctl )Создать надпись.
groupbox ( z -- ctl )Создать рамку с надписью. См. также -boxed.
Создать статическую иконку. Передается дескриптор иконки.
bitmap ( hbitmap -- ctl )Создать статическую картинку.
Создает обычную нажимающуюся кнопку. При нажатии кнопки вызывается слово, хранящееся в -command. Остальные уведомления о состоянии кнопки приходят через -notify.
![]() | Фон и надписи обычных кнопок программно окрасить нельзя. Они могут быть только стандартного системного цвета. |
Создает кнопку-иконку.
bitmap-button ( hbitmap -- ctl)Создает кнопку-картинку.
-defbutton ( -- )Объявляет последнюю созданную кнопку кнопкой по умолчанию. Такая кнопка выделяется визуально более толстой рамкой. Если нажать Enter, находясь в диалоговом окне, будет выполнена -command кнопки по умолчанию.
ok-button ( z xt -- ctl)Вспомогательное слово: объявляет кнопку по умолчанию с надписью z и командой xt.
cancel-button ( z -- ctl)Вспомогательное слово: объявляет кнопку "Отмена". При нажатии на нее модальный диалог будет снят с кодом IDCANCEL.
Создает кнопку с отметкой. Состояние кнопки можно узнать (ctl -state@), установить (TRUE ctl -state!) или сбросить (FALSE ctl -state!).
Создать радиокнопку, входящую в последнюю объявленную группу. При выборе кнопки в эту группу будет записано значение value. Можно узнать текущее состояние кнопки (ctl -state@) или установить конкретную кнопку (TRUE ctl -state!).
GROUP ( ->bl; -- )Объявить переменную, в которой будет храниться состояние группы. Узнать, какая из кнопок в группе установлена, можно, прочитав значение группы как обычную переменную. Если ни одна из кнопок не установлена, возвращается -1.
start-group ( group -- )Все последующие радиокнопки будут относиться к указанной группе.
clear-group ( group -- )Сбросить все кнопки в группе.
GROUP gg
gg start-group
0 " Veni" radio 1 " Vidi" radio 2 " Vici" radio
gg @ \ установленная кнопка или -1
Создать однострочный элемент ввода. Высота элемента устанавливается по текущему шрифту.
limit-edit ( n ctl -- )Ограничить поле ввода n символами.
multiedit ( -- ctl )Создать многострочный элемент ввода.
Номер текущей выбранной строки. Строки нумеруются от нуля. Свойство можно читать и записывать.
listbox ( -- ctl)Создает новый пустой список.
lb-addstring ( z ctl -- )Добавляет в конец списка новую строку.
lb-insertstring ( z pos ctl -- )Вставляет новую строку в указанную позицию списка.
lb-clear ( ctl -- )Очищает список.
lb-count ( ctl -- n)Возвращает количество элементов в списке.
lb-deletestring ( pos ctl -- )Удаляет строку в указанной позиции.
fromlist ( adr pos ctl -- )Заносит по адресу adr строку, хранящуюся в списке в указанной позиции.
lb-dir ( mask attr ctl -- )Заполняет список именами файлов. Mask - маска файлов, attr - аттрибуты файлов.
Создает новый пустой комбинированный список.
addstring ( z ctl -- )Добавляет в конец списка новую строку.
insertstring ( z pos ctl -- )Вставляет новую строку в указанную позицию списка.
clear-combo ( -- )Очищает список.
combo-count ( ctl -- n)Возвращает количество элементов в списке.
deletestring ( pos ctl -- )Удаляет строку в указанной позиции.
fromcombo ( adr pos ctl -- )Заносит по адресу adr строку, хранящуюся в списке в указанной позиции.
combo-dir ( mask attr ctl -- )Заполняет список именами файлов. Mask - маска файлов, attr - аттрибуты файлов.
Текущая позиция бегунка. Свойство можно читать и записывать.
-minМинимальная позиция бегунка.
-maxМаксимальная позиция бегунка.
hscroll ( -- ctl )Создает горизонтальную полосу прокрутки. Не путайте этот элемент управления с полосой прокрутки окна. Сообщения от полосы прокрутки приходят на ее список обработчиков -notify.
vscroll ( -- ctl)Создает вертикальную полосу прокрутки.
Переменная, в которой хранится последний созданный элемент управления.
ctlresize ( w h ctl -- )Меняет размер элемента управления.
ctlmove ( x y ctl -- )Перемещает элемент управления в указанное место. Координаты отмеряются в пикселях от левого верхнего угла клиентской области родительского окна.
ctlshow ( ctl -- )Показать элемент управления
ctlhide ( ctl -- )Спрятать элемент управления.
place ( x y ctl -- )Разместить элемент управления в указанном месте окна current-window. Это слово необходимо лишь в особых случаях - когда стандартное размещение с помощью сеток почему-либо не устраивает программиста.
remove ( ctl -- )Удаляет элемент с родительского окна, но оставляет его в памяти. Слово, противоположное place.
Если нужно одновременно установить сразу несколько свойств, можно использовать операцию групповой установки. Понять ее работу проще всего на следующем примере:
" Пример" label blue this -color! white this -bgcolor!
эквивалентно
" Пример" label (/ -color blue -bgcolor white /)
Обратите внимание, что после названия свойства ставить восклицательный знак не нужно. В операции групповой установки можно кроме настоящих свойств использовать некоторые псевдосвойства. Например, выставить размер элемента управления можно так:
edit (/ -size 120 20 /) |
А так определить имя элемента:
0 VALUE ec
...
edit (/ -name ec /) |
Начать новую сетку.
=== ( -- )Разделитель рядов сетки.
| ( ctl/grid -- )Добавить новую ячейку в текущий ряд и занести в нее элемент управления или вложенную сетку.
GRID; ( -- grid )Закончить описание сетки.
Расположение и размеры обитателя ячейки описывается следующим образом: -left, -center, -right ( -- )Выравнивать обитателя в пределах ячейки: влево, по центру, вправо.
-top, -middle, -bottom ( -- )Выравнивать обитателя в пределах ячейки: по верху, по середине, по низу.
-xmargin, -ymargin ( n -- )Установить горизонтальные или вертикальные поля в n пикселей каждое.
-xspan, -yspan ( -- )При масштабировании сетки обитатель ячейки будет растянут в горизонтальном или вертикальном направлении так, чтобы занять всю ячейку за исключением полей.
-width, -height ( n -- )Клетка будет занимать ровно n процентов от ширины или высоты всей сетки.
-xfixed ( -- )Клетка фиксирована в горизонтальном направлении, и ее ширина не будет меняться при масштабировании.
-yfixed ( -- )Текущий ряд зафиксирован и его высота не будет меняться при масштабировании.
-boxed ( -- )Текущая сетка будет окружена обводкой, проходящей по середине полей. Имеет смысл для вложенных сеток.
-bevel ( -- )Текущая сетка будет выглядеть вдавленной в родительское окно. Имеет смысл для вложенных сеток.
Создает безымянное диалоговое окно с заголовком ztitle. Обращаться к такому окну можно через переменную dialog.
SHOW ( grid -- )Присваивает сетку диалоговому окну и показывает его в центре главного окна программы. Ожидает, пока пользователь завершит работу диалога и скрывает диалоговое окно.
...MODAL ( -- )Уничтожает безымянное диалоговое окно.
end-dialog ( code -- )Устанавливает указанный код возврата и завершает диалог.
dialog-ok ( -- )Завершает диалог с кодом IDOK (успешное завершение)
dialog-cancel ( -- )Завершает диалог с кодом IDCANCEL (диалог отменен)
dialog-termination ( -- )После выполнения команды SHOW из этой переменной можно узнать, как закончился диалог. В ней хранится IDOK, если пользователь нажал кнопку Enter и была установлена кнопка по умолчанию; IDCANCEL, если пользователь нажал Esc или закрыл диалог крестиком в углу. Программы могут устанавливать также собственные коды завершения диалога словом end-dialog.
PROC: defbutt
" Диалог завершился успешно" msg
dialog-ok
PROC;
\ ...
" Пример диалога" MODAL...
GRID
...
" Ok" defbutt ok-button |
\ ...
GRID; SHOW
\ Теперь самое время прочитать значения элементов управления диалога
...MODAL
Пример работы с элементами управления
Пример: преобразование килограммов в фунты (автор: Е. Цымбалов)