Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Фролов Александр. Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT - royallib.ru.doc
Скачиваний:
98
Добавлен:
11.03.2016
Размер:
905.62 Кб
Скачать

Конструктор класса cDialogDlg

Конструктор класса CDialogDlg вызывает конструктор базового класса CDialog. При этом ему передается идентификатор диалоговой панели IDD и идентификатор главного окна приложения pParent. При создании объекта класса CDialogDlg не указываются никакие параметры. Поэтому pParent по умолчанию принимается равным NULL.

//////////////////////////////////////////////////////////////

// Конструктор класса CDialogDlg

CDialogDlg::CDialogDlg(CWnd* pParent /*=NULL*/) : CDialog(CDialogDlg::IDD, pParent) {

 //{{AFX_DATA_INIT(CDialogDlg)

 // В этом блоке ClassWizard размещает инициализацию

 // элементов данных класса

 //}}AFX_DATA_INIT

 // Вызов LoadIcon не требует последующего вызова

 // DestroyIcon, если вы используете программный интерфейс

 // Win32

 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

В теле конструктора расположен блок AFX_DATA_INIT . В него ClassWizard будет добавлять код инициализации элементов данных класса CDialogDlg. Конструктор также инициализирует m_hIcon, записывая в него идентификатор пиктограммы IDR_MAINFRAME.

Функция AfxGetApp возвращает указатель на объект главного класса приложения. Такой объект для данного приложения всегда один. В нашем случае AfxGetApp определяет указатель на объект theApp. Вот прототип этой функции:

CWinApp* AfxGetApp();

Метод DoDataExchange

Диалоговая панель приложения содержит только две кнопки и не имеет связанных с ними переменных. Однако метод DoDataExchange переопределен. Фактически он не выполняет ни какой работы. Единственное что он делает, это вызывает метод DoDataExchange базового класса CDialog.

Если вы добавите к диалоговой панели новые органы управления и свяжете их средствами ClassWizard с элементами данных класса CDialogDlg, то в блоке AFX_DATA_MAP будут размещены вызовы методов DDE и DDV , необходимые для выполнения обмена данными.

void CDialogDlg::DoDataExchange(CDataExchange* pDX) {

 CDialog::DoDataExchange(pDX);

 //{{AFX_DATA_MAP(CDialogDlg)

 // Здесь ClassWizard размещает вызовы методов DDX и DDV

 //}}AFX_DATA_MAP

}

Метод OnInitDialog

Когда вы отображаете диалоговую панель на экране, вызывая методы DoModal, Create или CreateIndirect, функции диалоговой панели передается сообщение WM_INITDIALOG. Вы не имеете доступа непосредственно в функции диалога. Ее реализация содержится в базовом классе CDialog.

В ответ на сообщение WM_INITDIALOG вызывается метод OnInitDialog, объявленный как виртуальный метод класса CDialog. Метод OnInitDialog вызывается непосредственно перед выводом панели на экран.

Таблица сообщений класса CDialogDlg не содержит макрокоманд для обработки сообщения WM_INITDIALOG. Метод OnInitDialog вызывается непосредственно MFC.

Чтобы реализовать собственную обработку сообщения WM_INITDIALOG, нужно просто переопределить метод OnInitDialog. Переопределенный метод должен сразу вызвать метод OnInitDialog базового класса CDialog.

Для приложения Dialog MFC AppWizard уже переопределил метод OnInitDialog. В реализации метода добавляется новая строка к системному меню диалоговой панели для вызова краткой справки о приложении. Затем вызывая метод SetIcon, определенный в базовом классе CWnd, мы выбираем пиктограммы для приложения.

Метод OnInitDialog возвращает значение TRUE. Это означает, что фокус ввода будет установлен на первый орган управления диалоговой панели. Первый орган диалоговой панели можно выбрать в редакторе диалоговой панели, выбрав из меню Layout строку Tab Order.

Если во время инициализации диалоговой панели метод OnInitDialog устанавливает фокус ввода другому органу управления, метод должен вернуть значение FALSE.

BOOL CDialogDlg::OnInitDialog() {

 CDialog::OnInitDialog();

 // Добавление строки "About…" к системному меню приложения

 // Проверяем, что идентификатор IDM_ABOUTBOX относится к

 // системным командам

 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

 ASSERT(IDM_ABOUTBOX < 0xF000);

 CMenu* pSysMenu = GetSystemMenu(FALSE);

 CString strAboutMenu;

 strAboutMenu.LoadString(IDS_ABOUTBOX);

 if (!strAboutMenu.IsEmpty()) {

  pSysMenu->AppendMenu(MF_SEPARATOR);

  pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

 }

 // Выбираем пиктограмму для диалоговой панели. Если главное

 // окно приложения не является диалоговой панелью этот код

 // не нужен

 SetIcon(m_hIcon,TRUE); // Выбираем пиктограмму большого

                        // размера

 SetIcon(m_hIcon,FALSE); // Выбираем пиктограмму маленького

                         // размера

 // TODO: Здесь вы можете выполнить дополнительную

 // инициализацию

 return TRUE;

}