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

Листинг 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.

Таблица сообщений класса CDialogApp

Таблица сообщений класса CDialogApp состоит из макрокоманд BEGIN_MESSAGE_MAP и END_MESSAGE_MAP. Между ними расположены макрокоманды, определяющие сообщения, обрабатываемые данным классом. В таблице определено только одно командное сообщение, имеющее идентификатор ID_HELP. Для его обработки вызывается метод OnHelp базового класса CWinApp.

Необработанные сообщения передаются базовому классу CWinApp, так как он указан во втором параметре макрокоманды BEGIN_MESSAGE_MAP.

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

// Таблица сообщений класса CDialogApp

BEGIN_MESSAGE_MAP(CDialogApp, CWinApp)

 //{{AFX_MSG_MAP(CDialogApp)

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

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

 //}}AFX_MSG

 ON_COMMAND(ID_HELP, CWinApp::OnHelp)

END_MESSAGE_MAP()

Обратите внимание, что внутри таблицы сообщений расположены две макрокоманды AFX_MSG, помещенные за знаками комментария. Сразу после создания приложения между ними нет ни одной макрокоманды. Когда вы будете создавать обработчики сообщений при помощи ClassWizard, он будет располагать новые обработчики между этими комментариями. Не рекомендуется вручную вносить изменения в код, расположенный в блоке AFX_MSG . Используйте для этого средства ClassWizard.

Если вам требуется добавить новый обработчик в таблицу сообщений, без использования ClassWizard, расположите его после блока AFX_MSG и до макрокоманды END_MESSAGE_MAP.

Приложение Dialog содержит еще одну таблицу сообщений, принадлежащую классу диалоговой панели приложения. Мы рассмотрим эту таблицу позже.

Непосредственно после таблицы сообщений главного класса приложения расположено определение конструктора CDialogApp. Этот конструктор вызывается в момент создания объекта приложения. Конструктор, созданный MFC AppWizard, пустой и не выполняет никаких дополнительных действий. Для инициализации приложения используются методы InitInstance и InitApplication.