Визуальное программирование и MFC

       

Немодальная диалоговая панель


Процедура создания и использования немодальной диалоговой панели несколько отличается от процедуры создания модальной диалоговой панели.

Панель и ее класс диалога

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

В классе немодального диалога следует переопределить метод Create базового класса CDialog следующим образом:

void CDlg::Create(CWnd* pParent) { CDialog::Create(IDD,pParent); // Вызов метода базового класса Parent=pParent; // окно-родитель }

Предварительно в класс диалога необходимо добавить элемент Parent - указатель на родительский объект, например, CWnd *Parent - указатель на родительское окно. Если родительский объект не окно, то можно добавить в метод Create параметр, отвечающий за передачу указателя на родительский объект, и присвоить его переменной Parent, объявив его в определении класса как указатель на объект соответствующего типа. Указатель на родительский объект позволяет при необходимости вызывать для родительского объекта методы его класса непосредственно из методов класса диалога, что обеспечивает связь немодального диалога и его родительского объекта.

В переопределенном методе Create следует обязательно вызвать метод Create базового класса CDialog. Именно этот метод создает окно диалоговой панели. В классе CDialog определены два прототипа метода Create. Один позволяет указать диалоговую панель через ее текстовое имя, а другой - через числовой идентификатор. Метод Create возвращает управление сразу после отображения на экране диалоговой панели. Он возвращает ненулевое значение, если создание диалоговой панели завершилось успешно, и нуль в противном случае.

При помощи ClassWizard в классе CDlg также следует создать заготовки методов-обработчиков сообщений от кнопок IDOK (OnOK) и IDCANCEL (OnCancel) и для сообщения WM_DESTROY (OnDestoy).
Затем необходимо изменить методы OnOK и OnCancel так, чтобы они вызывали только метод DestoyWindow. Если в методе Create предусматривается динамическое выделение блоков памяти, тогда в методе OnDestoy необходимо освободить занимаемую память.



Класс родительского объекта



Для обеспечения работы с немодальным диалогом сначала необходимо в классе приложения, в котором вызывается диалог (например, в классе окна приложения), объявить элемент Dlg класса CDlg. Родительский объект в методах своего класса может вызывать для диалоговой панели методы ее класса через объект Dlg, что обеспечивает связь родительского объекта и порождаемого им немодального диалога.



В момент создания объекта класса CDlg диалоговая панель как окно еще не создана и не появляется на экране. Для этого надо вызвать метод Create класса CDlg. Если диалоговая панель имеет стиль WS_VISIBLE, то она сразу появляется на экране. В противном случае для этого надо вызвать метод ShowWindow. Итак, в методе, который вызывает немодальный диалог (например, в методе-обработчике какого-либо сообщения для окна приложения), следует проверить, не отображается ли уже эта диалоговая панель, а затем создать ее методом Create класса CDlg:

if(Dlg.GetSafeHwnd()==NULL) Dlg.Create(this);

Чтобы закрыть немодальную диалоговую панель, можно воспользоваться методом DestroyWindow:

if(Dlg.GetSafeHwnd()!=NULL) Dlg.DestroyWindow();

Метод DestroyWindow определен в классе CWnd, следовательно, его можно вызывать для объектов класса диалоговой панели.


Содержание раздела