Есть два типа диалогов: модальные и немодальные. Наиболее распространены первые. В случае модальных диалогов, при активизации диалога основное окно приложения становится пассивным и перестает реагировать на действия пользователя до тех пор, пока он не закроет диалог. В случае немодальных диалогов, диалог существует независимо от других окон, и основное окно также может быть активизировано. Программировать немодальные диалоги немного труднее.
Построение диалоговых окон обеспечивается тремя конструкторами класса СDialog:
CDialog :: CDialog (LPCTSTR lpszTemplateName, CWnd * pParentWnd = NULL);
CDialog :: CDialog (UINT nIDTemplate, CWnd * pParentWnd = NULL);
CDialog :: CDialog ();
где lpszTemplateName содержит строку с ресурса шаблона диалогового окна, nIDTemplate - содержит идентификатор ресурса шаблона диалогового окна; pParentWnd - указатель на окно-владелец, например, главное окно программы.
Объявление класса модального диалогового окна:
class CSampleDialog: public CDialog
[public: CSampleDialog (UINT id, CWnd * Owner): CDialog (id, Owner) []
DECLARE_MESSAGE_MAP ()];
Конструктор класса CSampleDialog можно вызвать следующим образом:
CSampleDialog MyDialog (IDD_DIALOG1, NULL);
Объявление класса немодального диалогового окна:
class CModeLess : public CDialog
[public: CModeLess():CDialog()[]
DECLARE_MESSAGE_MAP()];
Вызов модального диалога с обработчика главного окна
void CMainWin :: OnDialog ()
[CSampleDialog a (IDD_DIALOG1, this);
a.DoModal ();]
Вызов немодального диалога с обработчика главного окна
CModeLess ml; // Глобальная переменная
void CMainWin :: OnModeless ()
[ml.Create (IDD_DIALOG2, this);
ml.ShowWindow (SW_SHOWNORMAL);]
_______________________________
// файл d01.h
class CApp : public CWinApp
{public: BOOL InitInstance();};
class CSampleDialog : public CDialog
{public: BOOL OnInitDialog();
void OnClose();
CSampleDialog(UINT id, CWnd *Owner):CDialog(id,Owner){}
DECLARE_MESSAGE_MAP()};
// файл d01.cpp
#include <afxwin.h>
#include "d01.h"
#include "resource.h"
BOOL CApp::InitInstance()
{CSampleDialog a(IDD_DIALOG1,m_pMainWnd);
a.DoModal();
return TRUE; }
CApp App;
BEGIN_MESSAGE_MAP(CSampleDialog,CDialog)
ON_COMMAND(ID_CLOSE,OnClose)
END_MESSAGE_MAP()
void CSampleDialog::OnClose(){SendMessage(WM_CLOSE);}
BOOL CSampleDialog::OnInitDialog()
{CDialog::OnInitDialog();
// у цьому прикладі функція OnInitDialog() фактично є зайвою
return TRUE;
}