Специальные (пользовательские) диалоговые окна


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

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

Многие приложения создают новый класс диалогового окна при помощи первого извлечения информации о классе для предопределенного класса блока диалога и передачи её в функцию GetClassInfo, которая заполняет поля структуры WNDCLASS этой информацией. Приложение изменяет отдельные члены структуры, такие как имя класса, кисть и значок, а затем регистрирует новый класс, используя функцию RegisterClass. Если прикладная программа заполняет структуру WNDCLASS самостоятельно, то она должна установить член структуры cbWndExtra в DLGWINDOWEXTRA, который - число дополнительных байтов, необходимых системе для каждого диалогового окна. Если приложение также использует дополнительные байты для каждого диалогового окна, они должны быть после дополнительных байтов, требуемых системой.

Оконная процедура для пользовательского диалогового окна имеет одни и те же параметры и требования, как любая другая оконная процедура. Однако, в отличие от других оконных процедур, оконная процедура для этого диалогового окна должна вызвать функцию DefDlgProc вместо функции DefWindowProc для любых сообщений, которые она не обрабатывает. DefDlgProc производит одну и ту же заданную по умолчанию обработку сообщений, что и оконная процедура для предопределенного диалогового окна, которая включает в себя вызов процедуры диалогового окна.

Приложение может также создавать пользовательские диалоговые окна, при помощи перехвата и обработки сообщений оконной процедуры предопределенного блока диалога. Функция SetWindowLong позволяет программе устанавливать оконную процедуру для заданного окна. Приложение может также сделать попытку создать подкласс, используя функцию SetClassLong, но делая так, программа воздействует на на все диалоговые окна в системе, а не только на те, которые принадлежат приложению.

Приложения, которые создают пользовательские диалоговые окна иногда, предоставляют дополнительный интерфейс клавиатуры для блоков диалога. Для немодальных диалоговых окон, под этим можно подразумевать, что  программа не вызывает функцию IsDialogMessage, а вместо этого обрабатывает весь ввод данных клавиатуры в специальной оконной процедуре. В таких случаях, приложение может использовать сообщение WM_NEXTDLGCTL, чтобы минимизировать код, необходимый для перемещения фокуса ввода данных из одного органа управления в другой. Это сообщение, когда передано в DefDlgProc, перемещает фокус ввода данных в указанный орган управления и модернизирует внешний вид органов управления, таких как заданную по умолчанию командную кнопку перемещения рамки или устанавливающуюся автоматически "радио" кнопку.

Назад в оглавление
На главную страницу

Hosted by uCoz