Ресурсы. Файл описания ресурса, страница 7

Здесь hDlgModeless представляет собой дескриптор HWND для диалогового окна. Эта глобальная переменная устанавливается в NULL, если немодальное диалоговое окно не отображено, и устанавливается равной дескриптору диалогового окна, если немодальное диалоговое окно находится на экране.

Функция IsDialogMessage позволяет определить, предназначено ли сообщение, поступившее от системы Windows, для диалогового окна. Если — да, то сообщение не обрабатывается обычными функциями TranslateMessage и DispatchMessage, а направляется в процедуру диалогового окна.

Клавиатурныйинтерфейсдиалоговогоокна

Встроенные алгоритмы Windows, предусмотренные для диалоговых окон, включают способы предоставления клавиатурных альтернатив выбору элементов с помощью мыши. В программе могут быть предусмотрены три возможных реакции на ввод с клавиатуры: клавиатурные вызывающие клавиши для выбора элементов с использованием комбинаций клавиш Alt+буква, отклик на нажатие клавиши Tab для больших перемещений и отклик на нажатие клавиш со стрелками клавиатуры для небольших перемещений.

Алгоритмы выбора с помощью комбинаций клавиш Alt+буква реализуются для диалоговых окон таким же образом, как и для пунктов меню. Если перед какой-либо буквой в строке текста надписи на элементе управления стоит амперсанд (&), то эта буква подчеркивается. Сами символы амперсанда не отображаются. Например, в следующем определении элемента управления DEFPUSHBUTTON в качестве вызывающей клавиши для активизации кнопки Done будет применяться Alt+D.

CONTROL "SDone", IDC_DONE, "BUTTON",

BS_DEFPUSHBUTTON | WSJTABSTOP | WS_CHILD, 45, 66, 48, 12

Если амперсанд должен появиться в тексте, необходимо указать два символа амперсанда (&&). Например, строка "Revenue && Receipts" в элементе управления будет выглядеть как Revenue & Receipts.

Применение клавиши Tab и клавиш со стрелками иногда является удобной альтернативой применению мыши. Это особенно важно для пользователей, не имеющих мыши. Чтобы воспользоваться преимуществом этих средств, необходимо установить некоторые элементы в шаблоне диалогового окна с применением стиля \VS_TABSTOP и/ или WS_GROUP.

Стиль WS_TABSTOP позволяет отметить каждый элемент, который должен получить фокус ввода при нажатии пользователем клавиши Tab или комбинации клавиш Shift+Tab. Стиль \VS_GROUP позволяет отметить начало группы. Все элементы, вплоть до следующего элемента WS_GROUP, становятся частью одной группы. Пользователь может перемещать фокус ввода с одного элемента в группе на другой с помощью клавиш со стрелками, не выходя за пределы группы. Клавиша Enter позволяет выбирать или отменять выбор кнопок, флажков или переключателей, имеющих фокус ввода. Эта процедура по своему действию аналогична выполнению выбора с помощью левой кнопки мыши.

Динамическиедиалоговыеокна

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

Функции CreateDiaioglndirect, CreateDialoglndirectParam, DialogBoxIndirect и DialogBoxIndirectParam считывают данные из памяти в указанном формате и создают диалоговое окно. Простым способом создания данных в правильном формате является определение диалогового окна в файле описания ресурса и загрузка ресурса в память с помощью функций LoadResource и LockResource. Данные должны быть представлены в формате, который вскоре будет описан. Чтобы диалоговое окно создавалось динамически, формат данных должен создаваться с нуля в распределенном блоке памяти.