Страница 9 из 40 Класс CDialog является родительским классом для пользовательских классов, используемый для отображения диалоговых окон на экране. Диалоговые окна могут быть модальными и немодальный. Модальное диалоговое окно должно быть закрыто пользователем прежде, чем приложение сможет продолжить свою работу. Немодальное диалоговое окно допускает работу пользователя с приложением до своего закрытия и удаления с экрана. Диалоговый объект является комбинацией шаблона диалога и одного из пользовательских классов, производных от класса CDialog. Для создания шаблона диалога и сохранения его в файле ресурсов обычно используется редактор диалога. Запуск мастера ClassWizard из окна редактора диалога позволяет создать соответствующий данному диалоговому окну класс, производный от класса CDialog. Диалоговое окно, подобно любому другому окну, получает сообщения от Windows. Основным назначением объекта пользовательского класса диалога является обработка сообщений, поступающих от объектов классов элементов управления данного диалогового окна, при взаимодействии пользователя с соответствующими элементами управления. Мастер ClassWizard просматривает потенциальные сообщения, которые может послать каждый элемент управления данного диалогового окна, и предоставляет пользователю возможность выбора тех сообщений, которые он действительно собирается обрабатывать. После выбора пользователем обрабатываемых сообщений, мастер ClassWizard добавляет соответствующие макросы в карту сообщения и создает заготовки функций обработки для данных сообщений в пользовательском классе диалогового окна. Все классы диалоговых окон, кроме самых простейших, содержат переменные для хранения информации, необходимой для работы с элементами управления диалогового окна. Мастер ClassWizard просматривает все классы элементов управления созданного пользователем диалогового окна и определяет, какие переменные могут понадобиться для работы с ними. Пользователь сам выбирает тип переменной и допустимый диапазон значений для каждой из создаваемых мастером переменных. После этого мастер ClassWizard добавляет описание соответствующих переменных в пользовательский класс диалога. После закрытия своего диалогового окна мастер ClassWizard составляет карту данных, позволяющую осуществлять автоматический обмен данными между переменными объекта класса диалогового окна и объектами классов элементов управления данного окна. Карта данных содержит функции, инициализирующие элементы управления диалогового окна соответствующими значениями, получающие информацию, содержащуюся в этих объектах, и проверяющие правильность передаваемой информации. Чтобы создавать модальное диалоговое окно, необходимо создать объект на стеке, используя конструктор пользовательского диалогового класса, присвоить его переменным исходные значения, а затем вызвать функцию DoModal, создающую окно диалога и его элементы управления. Чтобы создать немодальный диалог, вызовите в конструкторе вашего диалогового класса функцию Create. Одним из способов создания диалогового окна является создание в памяти объекта структуры DLGTEMPLATE. Для этого, после создания указателя на объект класса CDialog вызовите функцию CreateIndirect для создания немодального диалогового окна, или вызовите функции InitModalIndirect и DoModal для создания модального диалогового окна. Мастер ClassWizard помещает функции обмена и проверки правильности информации в функцию CWnd::DoDataExchange, которую он же и включает в класс пользовательского диалогового окна. Вызов данной функции обычно осуществляется в функции CWnd::UpdateData. Приложение вызывает функцию UpdateData, когда пользователь нажимает кнопку OK, чтобы закрыть модальное диалоговое окно. (Данные не обновляются при нажатии кнопки Cancel (Отмена)). Заданная по умолчанию реализация функции OnInitDialog вызывает функцию UpdateData, чтобы установить начальные значения переменных в объектах классов элементов управления. Обычно пользователь перегружает функцию OnInitDialog для проведения нестандартных операций по инициализации объектов классов элементов управления. Функция OnInitDialog вызывается после создания всех объектов классов элементов управления в диалоговом окне и непосредственно перед отображением диалогового окна на экране. Пользователь может вызывать функцию CWnd::UpdateData в любой функции класса модального или немодального диалогового окна. Для установки цвета фона диалогового окна в приложении используется функция CWinApp::SetDialogBkColor. Модальное диалоговое окно закрывается автоматически, когда пользователь нажимает кнопки OK или Cancel (Отмена) или когда программа непосредственно вызывает функцию EndDialog. При создании класса немодального диалогового окна необходимо всегда перегружать функцию OnCancel и вызывать в ней функцию DestroyWindow. При этом не следует вызывать функцию базового класса CDialog::OnCancel, поскольку она вызывает функцию EndDialog, которая сделает данное диалоговое окно невидимым, но не уничтожит его класс. Кроме того, при создании классов немодальных диалоговых окон необходимо перегрузить функцию PostNcDestroy, добавив в него оператор delete this, поскольку немодальные диалоговые окна обычно создаются оператором new. Объекты классов модальных диалоговых окон обычно являются локальными объектами функций и не нуждаются в самоликвидации в перегруженной функции PostNcDestroy. Описание данного класса содержится в файле заголовка afxwin.h. virtual int DoModal(); Возвращаемое значение Целочисленное значение, соответствующее значению аргумента nResult функции CDialog::EndDialog, которая использовалась для закрытия данного диалогового окна. Возвращаемое значение может быть -1, если функции не удалось создать данное диалоговое окно, или IDABORT, если при его создании возникла какая-либо другая ошибка. Описание Функция DoModal используется для отображения модального диалогового окна и возвращения результатов после его закрытия. Данная функция поддерживает интерфейс с пользователем при отображении диалогового окна. Она делает открытое ею диалоговое окно модальным, то есть перехватывает все обращения пользователя к приложению и реагирует только на обращения к элементам управления данного диалогового окна. Все остальные обращения пользователя игнорируются, кроме немаскируемого прерывания. Если пользователь нажимает в диалоговом окне кнопку OK или кнопку Cancel (Отмена), то вызываются соответствующие им функции обработки сообщений OnOK или OnCancel, закрывающие данное диалоговое окно. По умолчанию функция OnOK обновляет содержимое переменных в объекте класса диалогового окна, проверяет их правильность и закрывает диалоговое окно, возвращая величину IDOK, а функция OnCancel закрывает диалоговое окно без обновления значений переменных в данном объекте и возвращает величину IDCANCEL. Пользователь может перегружать эти функции. В настоящее время в стандартный процесс создания модального диалогового окна включена функция PreTranslateMessage. CDocTemplate представляет собой абстрактный класс, определяет базисные функциональные возможности шаблонов документа. В функции CWinApp::InitInstance обычно создается один или несколько шаблонов документа, определяющих взаимодействие трех типов классов: "sectiontableheader"класса документа, являющегося потомком класса Cdocument; "sectiontableheader"класса представления, отображающего данные, хранящиеся в связанном с ним классе документа. Этот класс может быть потомком класса CView, CScrollView, CFormView или CEditView (класс CEditView может непосредственно использоваться в шаблонах документов); "sectiontableheader"класса окна, связанного с классом представления. Для однооконного приложения (SDI) базовым классом является класс CFrameWnd. Для многооконного приложения (MDI) базовым классом является класс CMDIChildWnd. Если приложение не использует нестандартные методы работы с окном, то в шаблоне документа может непосредственно использоваться класс CFrameWnd или CMDIChildWnd. В противном случае пользователю придется создать и использовать собственный класс, производный от одного из вышеперечисленных классов. Приложение должно создавать по одному шаблону документа для каждого используемого в нем типа документа. Например, если приложение использует электронные таблицы и текстовые документы, оно должно иметь два объекта класса шаблона документа. Каждый шаблон документа ответственен за создание и управление всеми документами типа. Шаблон документа сохраняет указатели на объекты класса CRuntimeClass, соответствующие классам документа, представления и окна. Эти объекты класса CRuntimeClass создаются при создании шаблона документа. Шаблон документа содержит идентификаторы ресурсов, используемых совместно с данным типом документа (например, меню, значки или таблицы акселераторов). Шаблон документа также имеет строки, содержащие дополнительную информацию относительно типа документа. Они включают имя типа документа (например, "Рабочий лист") и расширение файла (например, ".xls"). Кроме того, шаблон документа может содержать другие строки, содержащие информацию, используемую интерфейсом пользователя приложения и диспетчером файлов Windows. Если приложение является контейнером объектов OLE, шаблон документа содержит также идентификатор меню, используемого при работе с данным объектом. Если приложение является сервером объектов OLE, шаблон документа, кроме идентификатора меню, содержит идентификатор инструментальной панели. Для определения этих дополнительных ресурсов OLE используются функции SetContainerInfo и SetServerInfo. Поскольку класс CDocTemplate является абстрактным классом, то с его объектами нельзя работать непосредственно. Типичное приложение использует один из двух производных от него классов, определенных в библиотеке MFC: CSingleDocTemplate, обеспечивающий работу однооконного приложения, и CMultiDocTemplate, обеспечивающий работу многооконного приложения. Если создаваемое пользователем приложение требует парадигмы интерфейса пользователя, существенно отличающейся от SDI или MDI, ему необходимо создать свой собственный класс, производный от CDocTemplate. Описание данного класса содержится в файле заголовка afxwin.h. |