Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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

Поиск

В Windows каждому диалоговому окну обеспечивается клавиатурный интерфейс, позволяющий пользователю перемещать фокус ввода по очереди между всеми ЭУ клавишей Tab, циклически перемещаться внутри группы ЭУ клавишами курсора, выбирать ЭУ нажатием его клавиши быстрого выбора (подчеркнутого символа в тексте метки). На клавиатурный интерфейс влияют следующие компоненты шаблона диалогового окна:

· порядок создания элементов управления;

· использование символов амперсанда (&) в тексте меток для обозначения клавиш быстрого выбора;

· использование стиля WS_GROUP для объединения ЭУ в группы;

· использование стиля DEFPUSHBUTTON для обозначения нажимаемой кнопки, выбираемой по умолчанию (по нажатию Enter).

Порядок создания ЭУ задает очередность передачи меду ними фокуса ввода клавишей Tab или Shift-Tab (tab order). В большинстве редакторов диалогов этот порядок можно задать визуально.

Важным вопросом клавиатурного интерфейса, особенно для кнопок с зависимой фиксацией, является объединение ЭУ в группы. Кнопки со стилем BS_AUTORADIOBUTTON должны быть сгруппированы, чтобы Windows могла автоматически перемещать отметку между кнопками этой группы. Чтобы объединить кнопки (или другие ЭУ) в группу, надо сначала расположить их последовательно в порядке обхода клавишей Tab, затем первой из этих кнопок в окне свойств присвоить стиль WS_GROUP, а также присвоить этот стиль первому ЭУ, которой располагается после создаваемой группы.

Все компоненты клавиатурного интерфейса можно задать в редакторе диалогов Visual C++. Порядок обхода клавишей Tab задается после выбора команды LayoutÞTab Order, последовательными щелчками мыши на всех ЭУ. В диалоговом редакторе порядок обхода показывается в виде прямоугольников с порядковыми числами (рис. 8.2).

 

Рис. 8.2. Редактор диалогов Visual C++ в режиме задания порядка обхода ЭУ по клавише Tab.

 

1.2 Класс CDialog

Для всех, за исключением самых примитивных, диалоговых окон, кроме разработки шаблона требуется описать класс-оболочку как подкласс CDialog. В этом подклассе надо реализовать поведение конкретного окна. В целом, у подклассов CDialog часто перегружаются три виртуальные функции: инициализация элементов управления (OnInitDialog) и обработчики кнопок OK (OnOK) и Отмена (OnCancel). Хотя каждая из этих функций соответствует определенному сообщению диалогового окна, для их обработки не требуется карта сообщений – она скрыта внутри CDialog и обработчики реализованы в виде обычных виртуальных функций. У CDialog есть версии этих функций "по умолчанию", поэтому иногда можно обойтись без их перегрузки, а для обмена данными с ЭУ пользоваться механизмом обмена данными диалоговых окон MFC (Dialog Data Exchange and Dialog Data Validation).

При создании диалогового окна оно получает сообщение WM_CREATE, как и любое другое окно. Но в момент получения WM_CREATE в диалоговом окне еще не созданы ЭУ, описанные в шаблоне окна. Поэтому их нельзя проинициализировать в обработчике данного сообщения. Внутренняя оконная процедура диалоговых окон Windows обрабатывает сообщение WM_CREATE, как раз чтобы выполнить создание ЭУ. После того. как все они созданы, диалоговому окну посылается сообщение WM_INITDIALOG, чтобы окно смогло произвести необходимую инициализацию ЭУ. В подклассах CDialog сообщение WM_INITDIALOG приводит к вызову функции-члена OnInitDialog:

virtual BOOL OnInitDialog()

В OnInitDialog можно выполнить все действия, необходимые для подготовки окна к работе – например, пометить кнопку с зависимой фиксацией или поместить текст в строку ввода В момент вызова OnInitDialog диалоговое окно на экран еще не выведено. Возвращаемое значение OnInitDialog указывает Windows, что делать с фокусом ввода. Если OnInitDialog возвращает TRUE, то Windows устанавливает фокус ввода на первый по порядку обхода ЭУ окна. Если требуется установить фокус на другой элемент, надо сделать это в OnInitDialog вызовом SetFocus у класса ЭУ и вернуть из OnInitDialog значение FALSE. Получить указатель на CWnd для ЭУ с известным идентификатором можно функцией GetDlgItem, например:

GetDlgItem(IDC_EDIT)->SetFocus();

При перегрузке OnInitDialog надо обязательно вызывать OnInitDialog базового класса.

Чтобы по нажатию кнопок OK и Отмена вызывались виртуальные функции CDialog::OnOK и OnCancel, у этих кнопок в шаблоне окна должны быть идентификаторы IDOK и IDCANCEL.

Функцию-член OnOK можно перегрузить для выполнения специализированной обработки перед закрытием окна, например, для извлечения данных из ЭУ и, возможно, для проверки корректности этих данных (например, что число попадает в допустимый диапазон). В собственной реализации OnOK обязательно надо закрыть диалоговое окно вызовом EndDialog или вызывать для этого OnOK из базового класса. Если этого не сделать, при нажатии кнопки OK окно не будет закрываться.

Обработчик OnCancel вызывается не только при нажатии кнопки с идентификатором IDCANCEL, но и по нажатию клавиши Esc или при закрытии окна кнопкой в строке заголовка. OnCancel перегружается редко, т.к. по нажатию кнопки Отмена обычно не требуется считывать данные из ЭУ. По умолчанию CDialog::OnCancel вызывает EndDialog с параметром IDCANCEL, чтобы закрыть диалоговое окно и проинформировать вызывающую функцию, что изменения в диалоговом окне должны быть проигнорированы.

За исключением специфического сообщения WM_INITDIALOG, диалоговые окна получают те же самые сообщения, что и все остальные окна. Вы можете добавить записи в карту сообщений диалогового окна для обработки любых необходимых сообщений и уведомлений. Допустим, в диалоговом окне есть кнопка Сброс с идентификатором IDC_RESET. Чтобы при нажатии этой кнопки вызывался обработчик OnReset, надо добавить в карту сообщений запись:

ON_BN_CLICKED(IDC_RESET, OnReset)

В диалоговых окнах можно обрабатывать даже сообщения WM_PAINT (например, чтобы сделать у окна необычный фон), но обработчики OnPaint используются редко, т.к. элементы управления сами перерисовывают свою экранную область.

 



Поделиться:


Последнее изменение этой страницы: 2016-08-01; просмотров: 245; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.191.14.104 (0.008 с.)