- •Разработка объектно-ориентированных программ
- •Методические указания
- •1. Методология программирования
- •1.1. Методология объектно-ориентированного
- •1.2. Методология объектно-ориентированного анализа
- •2. Особенности программирования в среде Windows
- •2.1 Разработка объектно-ориентированных программ
- •2.2. Разработка объектно-ориентированных программ
- •4. Лабораторный практикум
- •4.1. Лабораторная работа 1.
- •Общие сведения
- •Лабораторное задание
- •Варианты лабораторных заданий
- •Контрольные вопросы
- •4.2. Лабораторная работа 2.
- •Общие сведения
- •Лабораторное задание
- •Варианты лабораторных заданий
- •4.3. Лабораторная работа 3.
- •Общие сведения
- •Лабораторное задание
- •Варианты лабораторных заданий
- •4.4. Лабораторная работа 4.
- •Общие сведения
- •Лабораторное задание
- •4.5. Лабораторная работа 5.
- •Общие сведения.
- •Лабораторное задание
- •Варианты лабораторных заданий
- •4.6. Лабораторная работа 6.
- •Общие сведения.
- •Лабораторное задание
- •Варианты лабораторных заданий
- •4.7. Лабораторная работа 7.
- •Общие сведения.
- •Лабораторное задание.
- •Приложение а. Спецификации api-функций.
- •Приложение б. Основные классы mfc.
2.2. Разработка объектно-ориентированных программ
с использованием библиотеки фундаментальных классов
Библиотека фундаментальных классов (MFC) представляет собой не просто совокупность классов, которые программист может использовать при разработке своих программ. Классы в MFC образуют иерархию, поскольку имеются базовые и производные классы. В этом смысле можно говорить о каркасе приложения, т.е. о некоторой части (взаимосвязанном подмножестве) классов MFC, которую можно использовать в качестве основы приложения (очень часто практически невидимой). При использовании MFC AppWizard в процессе создания проекта программы каркас приложения создается автоматически, причем его специфика определяется установками пользователя.
Каркас приложения является полным приложением, которое можно настраивать с целью удовлетворения потребностей пользователя. При этом, если каркас приложения выполняет то, что от него ожидается, то это влечет за собой создание намного меньшего объема кода, чем в случае, когда используются относительно независимые объекты библиотеки классов. Модель программирования MFC предполагает изменение каркаса приложения с тем, чтобы достичь поставленных целей. Этот процесс можно назвать программированием при помощи исключений.
Каждая программа MFC также включает функции WinMain() и WndProc(). Однако эти функции скрыты в каркасе приложения и невидимы в исходном коде программы.
При рассмотрении программы MFC всегда обнаруживаются два объекта: объект главного окна и объект приложения, например:
#include <afxwin.h>
// Класс главного окна
class CMyWindow : public CFrameWnd
{
public:
CMyWindow() { Create(0, “My Window”); }
};
// Класс приложения
class CMyApp : public CWinApp
{
public:
virtual BOOL InitInstance()
{
m_pMainWnd = new CMyWindow();
m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);
return TRUE;
}
};
CMyApp TheMyMFCApp;
При запуске данной программы на экране отображается полнофункциональное (правда, совершенно бесполезное) окно, представленное на рис. 1.
Класс CMyWindow порожден от класса MFC CFrameWnd, а класс CMyApp – от класса MFC CWinApp (объявления базовых классов CFrameWnd и CWinApp включены в заголовочный файл каркаса приложения afxwin.h).
Поскольку каждый из созданных пользователем классов наследует много функциональных возможностей, классы являются небольшими и простыми. Класс CMyWindow только определяет общий конструктор, который вызывает метод Create(), унаследованный от класса-предка и о пределяющий имя окна.
Рис. 1. Окно простой MFC программы.
Класс CMyApp просто перекрывает виртуальный метод InitInstance(). Внутри метода он создает экземпляр класса CMyWindow и присваивает возвращаемый указатель на унаследованный элемент данных m_pMainWnd. Затем этот указатель используется для вызова функции ShowWindow(), передавая параметр, который заставляет окно отображаться в развернутом виде. В заключении метод возвращает значение TRUE, которое сообщает об успешном завершении. Является существенным, что программа создает экземпляр приложения (объект TheMyMFCApp) с глобальной областью видимости. Создание этого глобального объекта запускает программу на выполнение.
3. Создание проекта в среде Visual С++ 6.0
Одним из ключевых моментов при разработке объектно-ориентированной программы в среде Visual C++ 6.0 является проект (Project). В проекте хранятся основные параметры программы и среды разработки. Проект хранится в файле с расширением dsp. При создании проекта (т.е. на начальном этапе разработки новой программы) определяется его имя и задаются параметры программы, получаемой с использованием этого проекта. С проектом тесно связано понятие рабочего пространства программы (Work Space). Параметры рабочего пространства хранятся в файле с расширением dsw. Файл *.dsw объединяет все проекты, программы в единое целое.
Для создания проекта необходимо в меню File выбрать пункт New. Далее следует определить имя проекта, его расположение, рабочее пространство, задать тип платформы (например, Win32) и выбрать тип проекта из списка (рис.2).
Рис.2. Окно проекта среды Visual C++.
Ниже дается краткая характеристика некоторых типов проекта.
Win32 Console Application. Консольные программы имитируют работу в среде DOS и разрабатываются с использованием консольных API-функций, поддерживающих символьный ввод-вывод в консольных окнах. Поддерживается стандартный ввод-вывод с использованием, например таких функций, как printf() и scanf(). Выполнение консольной программы начинается с функции main().
Win32 Application. Данный тип проекта предназначен для создания программ, представляющих собой Windows-приложение, использующее, в первую очередь, Win32 API. Программа включает стандартные функции API WinMain(), WndProc(), InitInstance(), MyRegisterClass(), GetMessage(), TranslateMessage(), DispatchMessage(), CreateWindow(), ShowWindow(), UpdateWindow() и другие. Программист имеет возможность наращивать функциональность программы, самостоятельно добавляя меню, панель инструментов и т.д.
MFC App Wizard (exe). Данный тип проекта предполагает создание программы, использующей библиотеку фундаментальных классов MFC. При этом процесс создания проекта является многошаговым (от 4 до 6 шагов) и протекает под управлением «помощника» в виде AppWizard. В зависимости от опций, выбираемых пользователем, автоматически подключаются те или иные классы MFC, и формируется соответствующий программный код.
На шаге 1 необходимо выбрать архитектуру приложения: Single Document (SDI), Multiple Document (MDI) или Dialog Based и указать, требуется ли поддержка архитектуры документ/представление (document/view architecture), т.е. использование классов MFC для работы с файлами и окнами (рис.3).
Рис.3. Выбор архитектуры MFC-приложения.
При выборе первых двух архитектур автоматически создается каркас приложения, реализующий стандартное меню. На шагах 2-6 определяется, включать ли в каркас приложения поддержку базы данных, панели инструментов, строки состояния, печати с ее предварительным просмотром, элементов управления ActiveX и т.д.
Выбор архитектуры Dialog Based предполагает создание программы с пользовательским интерфейсом, построенным на базе диалогового окна с размещенными на нем элементами управления. Меню и панель инструментов в этом случае пользователь при необходимости создает самостоятельно.
Независимо от выбранной архитектуры приложения необходимо определить способ использования библиотеки MFC. Существуют два способа использования библиотеки:
As a shared DLL;
As a statically linked library.
Первый способ используется на этапе первоначальной отладки программы и предполагает создание проекта типа Debug. Библиотечные функции MFC не включаются в exe-файл. Для выполнения программы требуются некоторые dll-файлы (например mfc42d.dll, находящийся в системной библиотеке Windows).
Второй способ используется для получения «самодостаточного» exe-файла, включающего библиотечные функции и предполагает создание проекта типа Release. На более поздних этапах отладки программы Debug-проект можно перекомпилировать с целью получения Release-проекта.