Для распределения сообщений от клавиатуры используется концепция так называемого клавиатурного фокуса ввода. Фокус ввода - это атрибут, который присваивается элементу диалога. Если элемент имеет фокус ввода, то он получает все клавиатурные сообщения (в основном :-) из системной очереди FAR Manager.
Менеджер диалогов может передавать фокус ввода от одного элемента другому. Когда вы нажимаете клавиши Tab, Shift-Tab или Alt-Символ, фокус ввода передается следующему/предыдущему элементу диалога (или элементу диалога, имеющему соответствующую горячую клавишу).
Функция обработки диалога может проследить за получением и потерей фокуса ввода. Когда элемент получает фокус ввода, функции-обработчику передается сообщение DN_GOTFOCUS. Когда элемент теряет фокус ввода, функции-обработчику передается сообщение DN_KILLFOCUS. В ответ на сообщение DN_KILLFOCUS функция обработки диалога может запретить потерю фокуса ввода, вернув значение -1. Сообщение DN_GOTFOCUS носит чисто информативный характер, т.е. вы не можете отменить данное событие, как таковое.
Программный интерфейс Dialog API Far Manager содержит два сообщения, позволяющие узнать или изменить элемент, владеющий фокусом ввода. Эти сообщения имеют соответственно имена DM_GETFOCUS и DM_SETFOCUS.
Ниже перечислены элементы диалога, которые могут иметь клавиатурный фокус ввода (при условии, что для этих элементов не выставлены флаги DIF_NOFOCUS и/или DIF_DISABLE):
| Элемент | Описание |
|---|---|
| DI_BUTTON | Кнопка (Push Button). |
| DI_CHECKBOX | Контрольный переключатель (Check Box). |
| DI_COMBOBOX | Комбинированный список. |
| DI_EDIT | Поле ввода. |
| DI_FIXEDIT | Поле ввода фиксированного размера. |
| DI_LISTBOX | Окно списка. |
| DI_PSWEDIT | Поле ввода пароля. |
| DI_RADIOBUTTON | Селекторная кнопка (Radio Button). |
| DI_USERCONTROL | Элемент управления, определяемый программистом. |