Microsoft Visual C++ и MFC. Программирование для Win95 и WinNT

         

Главный класс приложения Dialog


Главный класс приложения CDialogApp, наследованный от базового класса CWinApp, определен во включаемом файле Dialog.h. Исходный текст этого файла содержится в листинге 4.1.

Первые строки файла содержат директиву #ifndef, которая проверяет, определен ли символ __AFXWIN_H__. Символ __AFXWIN_H__ определен в файле afxwin.h. Если на этапе обработки файла Dialog.h символ не определен, то при построении проекта выдается сообщение об ошибке. Это гарантирует, что включаемый файл afxwin.h будет обработан до Dialog.h.

Следующая директива #include включает файл resource.h. Этот файл создается MFC AppWizard и содержит определение идентификаторов, задействованных для ресурсов приложения.

Листинг 4.1. Файл Dialog.h

// Dialog.h : Главный включаемый файл для приложения Dialog

//

#ifndef __AFXWIN_H__

      #error include 'stdafx.h' before including this file for PCH

#endif

#include "resource.h"   // включаемый файл содержащий

                        // идентификаторы ресурсов приложения

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

// Класс CDialogApp:

// Методы класса CDialogApp определены в файле Dialog.cpp

//

class CDialogApp : public CWinApp

{

public:

      CDialogApp();

// Overrides

      // В следующем блоке ClassWizard помещает описания

      // переопределенных виртуальных методов класса

      //{{AFX_VIRTUAL(CDialogApp)

public:

      virtual BOOL InitInstance();

      //}}AFX_VIRTUAL

// Implementation

      //{{AFX_MSG(CDialogApp)

             // В этом блоке ClassWizard размещает описания методов

             // класса. Не редактируйте содержимое этого блока вручную

      //}}AFX_MSG

      DECLARE_MESSAGE_MAP()

};

Для класса CDialogApp описан конструктор CDialogApp, не имеющий параметров. Этот конструктор будет использоваться в момент запуска приложения для создания объекта класса CDialogApp.

Кроме конструктора, в классе CDialogApp, переопределяется виртуальный метод InitInstance базового класса CWinApp. Как видите, метод InitInstance находится, после комментария // Overrides, который обозначает секцию переопределения виртуальных методов.


В принципе вы можете удалить комментарий // Overrides, это ни как не повлияет на работу приложения. Все комментарии типа // Overrides и // Implementation вставляются MFC AppWizard для программиста, чтобы ему было легче определить назначение метода или элемента данных класса.

MFC AppWizard поместил объявление метода InitInstance внутри блока комментариев AFX_VIRTUAL. Первая и последняя строка, обозначающая этот блок, не влияют на работу программы, так как они являются комментариями (расположены после символов комментария //). Блок AFX_VIRTUAL нужен ClassWizard, чтобы выделить методы класса, которые им управляются. Вы не должны вручную вносить изменения в этот блок и другие блоки AFX_.

Более подробно о блоках AFX_ и других комментариях, вставляемых MFC AppWizard и ClassWizard, мы рассказывали в разделе “Имена, используемые MFC” данной главы книги.

Основной файл приложения имеет имя, совпадающее с именем проекта - Dialog.cpp. Текст этого файла приведен нами в листинге 4.2. Файл содержит реализацию методов главного класса приложения CDialogApp.

Листинг 4.2. Файл Dialog.cpp

// Dialog.cpp : Определяет главный класс приложения

//

// Включаемые файлы

#include "stdafx.h"

#include "Dialog.h"

#include "DialogDlg.h"

// Для отладочной версии приложения включается дополнительные

// определения

#ifdef _DEBUG

      #define new DEBUG_NEW

      #undef THIS_FILE

      static char THIS_FILE[] = __FILE__;

#endif

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

// CDialogApp

BEGIN_MESSAGE_MAP(CDialogApp, CWinApp)

      //{{AFX_MSG_MAP(CDialogApp)

      // ClassWizard размещает в данном блоке макрокоманды для

      // обработки сообщений. Не изменяйте содержимое этого блока

      // вручную

      //}}AFX_MSG

      ON_COMMAND(ID_HELP, CWinApp::OnHelp)

END_MESSAGE_MAP()

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

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



CDialogApp::CDialogApp()

{

      // TODO: здесь вы можете добавить собственный код

}

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

// Создаем один объект класса CDialogApp. Это будет главный

// объект приложения

CDialogApp theApp;

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

// Инициализация приложения

BOOL CDialogApp::InitInstance()

{

// Стандартная инициализация приложения. Вы можете сократить

// размер выполняемого модуля приложения, если удалите

// инициализацию, которая вам не нужна

#ifdef _AFXDLL

      Enable3dControls();

#else

      Enable3dControlsStatic();

#endif

      CDialogDlg dlg;

      m_pMainWnd = &dlg;

      int nResponse = dlg.DoModal();

      if (nResponse == IDOK)

      {

             // TODO: Здесь вы можете разместить код приложения,

             // который вызывается, если пользователь нажмет кнопку OK

             // в диалоговой панели приложения

      }

      else if (nResponse == IDCANCEL)

      {

             // TODO: Здесь вы можете разместить код приложения,

             // который вызывается, если пользователь нажмет кнопку

             // Cancel в диалоговой панели приложения

      }

      // Так как диалоговая панель закрыта, возвращаем значение

      // FALSE чтобы завершить приложение

      return FALSE;

}

В начале файла Dialog.cpp подключены три файла stdafx.h, Dialog.h и DialogDlg.h. Файл stdafx.h будет описан нами ниже. Сейчас отметим, что он содержит определения, необходимые для библиотеки классов MFC.

Файл Dialog.h содержит описание главного класса приложения CDialogApp. Файл DialogDlg.h включает описание класса диалоговой панели приложения. Именно эта панель будет представлять пользовательский интерфейс нашего приложения.

Далее директива #ifdef проверяет, был ли определен символ _DEBUG. Вы не найдете определение _DEBUG ни в одном исходном файле проекта. Этот символ определяется самой средой VIsual C++, если вы создаете отладочную версию приложения.



#ifdef _DEBUG

      #define new DEBUG_NEW

      #undef THIS_FILE

      static char THIS_FILE[] = __FILE__;

#endif

Для отладочной версии приложения определяется символ DEBUG_NEW и переопределяется статическая переменная THIS_FILE. Если такой символ уже был определен, он предварительно отменяется  директивой #undef, а затем определяется снова.

THIS_FILE определяется как символьная строка, в которую записывается имя исходного файла данного модуля, определенное специальным символом __FILE__ (то, есть Dialog.cpp).

Исходные тексты приложений, подготовленных с использованием средств автоматизированного проектирования MFC AppWizard и ClassWizard, активно используют символы, определенные в среде VIsual C++. Чтобы просмотреть их список, выберите из меню Build строку Settings. На экране появится диалоговая панель Project Settings, содержащая несколько страниц. Выберите страницу C/C ++ (рис. 4.9).

В поле Settings For приложение Dialog представлено двумя строками. Одна выбирает параметры проекта для отладочной версии приложения, а вторая для законченной, не отладочной, версии.

В поле Preprocessor definitions отображается список символов, определенных для данного проекта. Вы можете добавить в этот список новые символы, или убрать символы, которые уже определены.



Рис. 4.9. Настройка проекта

Далее в исходном файле располагается таблица сообщений главного класса приложения. На первый взгляд внешний вид таблицы сообщений соответствует таблице сообщений приложения MFMessage.


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