Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

1.1 Преимущества использования Си++/MFC по сравнению с Си/Windows API

При разработке программ для Windows на языке Си с использованием функций API возникает ряд сложностей. Функций и сообщений Windows очень много, их тяжело запомнить. Оконные процедуры на Си принимают характерную и трудно читаемую форму в виде обширных операторов switch, часто вложенных друг в друга.

Объектно-ориентированное проектирование имеет ряд преимуществ по сравнению со структурным при разработке больших проектов: легче создавать повторно используемые компоненты, есть более гибкие средства скрытия данных и процедур.

Применительно к программированию для Windows можно сказать, что без готовой библиотеки классов ООП дает весьма незначительное уменьшение количества исходного текста, который должен написать программист. Основные преимущества ООП проявляются при использовании библиотеки классов – т. е. набора повторно используемых компонент. Эти компоненты облегчают решение типичных задач, например, для добавления в приложение MFC стыкуемой панели инструментов можно использовать класс CToolBar, которому надо только указать параметры кнопок панели. Использовать сложные технологии Windows, например, технологии ActiveX (в том числе COM и OLE) без готовых классов практически невозможно.

Еще одно преимущество, предоставляемое MFC, – это готовый каркас приложения. Он устроен таким образом, что объекты Windows (окна, диалоговые окна, элементы управления и др.) выглядят в программах как объекты классов Си++.

1.2 Основные задачи проектирования MFC

При проектировании MFC перед разработчиками Microsoft стояли две основных задачи:

НЕ нашли? Не то? Что вы ищете?

1)  MFC должна служить объектно-ориентированным интерфейсом для доступа к API операционных систем семейства Windows с помощью повторно используемых компонент – классов.

2)  накладные расходы по времени вычислений и по объему памяти при использовании MFC должны быть минимальны.

Для достижения первой цели были разработаны классы, инкапсулирующих окна, диалоговые окна и другие объекты операционной системы. В этих классах было предусмотрено много виртуальных функций, которые можно перегружать в производных классах и таким образом модифицировать поведение объектов ОС.

Уменьшение накладных расходов на библиотеку MFC было достигнуто за счет решений, определяющих способ реализации классов MFC – о том, как именно объекты ОС будут оформлены в виде классов. Одно из этих решений – способ связи между объектами MFC и объектами Windows. В Windows информация о свойствах и текущем состоянии окна хранится в служебной памяти, принадлежащей ОС. Эта информация скрыта от приложений, которые работают с окнами исключительно посредством дескрипторов (переменных типа HWND). В MFC "оболочкой" окна является класс CWnd. Но в нем нет переменных-членов, дублирующих все свойства окна с заданным HWND. В классе CWnd хранится только дескриптор окна. Для этого заведена открытая переменная-член CWnd::m_hWnd типа HWND. Когда программист запрашивает у объекта CWnd какое-нибудь свойство окна (напр., заголовок), то этот объект вызывает соответствующую функцию API, а затем возвращает полученный результат.

Описанная схема применяется в MFC для реализации практически всех классов, служащих оболочками объектов Windows, т. е. внутри этих классов хранятся только дескрипторы объектов.

1.3 Архитектура "документ/вид"

В устройстве каркаса приложения MFC важнейшую роль играет архитектура "документ/вид". Это такой способ проектирования приложения, когда в нем отдельно создаются объекты-документы, ответственные за хранение данных приложения, и объекты-виды, ответственные за отображение этих данных различными способами. Базовыми классами для документов и видов в MFC служат классы CDocument и CView. Классы каркаса приложения CWinApp, CFrameWnd и др. работают совместно с CDocument и CView, чтобы обеспечить функционирование приложения в целом. Сейчас пока рано обсуждать детали архитектуры "документ/вид", но вы должны, как минимум, знать термин "документ/вид", часто упоминаемый при рассмотрении MFC.

Приложения MFC можно писать и без использования документов и видов (например, при изучении основ MFC). Но доступ к большинству возможностей каркаса возможен только при поддержке архитектурs "документ/вид". В действительности это не является жестким ограничением структуры приложения, и большинство программ, обрабатывающих документы какого-либо типа, могут быть преобразованы в эту архитектуру. Не следует думать (по аналогии с термином "документ"), что эта архитектура полезна только для написания текстовых редакторов и электронных таблиц. "Документ" – это абстрактное представление данных программы в памяти компьютера. Например, документ может быть просто массивом байт для хранения игрового поля компьютерной игры, или он действительно может быть электронной таблицей.

Какие именно преимущества получают в MFC приложения "документ/вид"? В частности, это значительное упрощение печати и предварительного просмотра, готовый механизм сохранения и чтения документов с диска, преобразование приложений в серверы документов ActiveX (приложения, документы которых можно открывать в Internet Explorer). Подробно архитектура документ/вид будет рассмотрена позже.

1.4 Иерархия классов MFC

Большинство классов MFC явно или неявно унаследованы от класса CObject. Класс CObject обеспечивает для своих подклассов три важных возможности:

·  сериализация (запись или чтение данных объекта на диск);

·  средства динамического получения информации о классе;

·  диагностическая и отладочная поддержка.

Под термином "сериализация" подразумевается преобразование данных объекта в последовательную форму, пригодную для записи или чтения из файла. Используя CObject в качестве базового класса, легко создавать сериализуемые классы, объекты которых можно записывать и считывать с диска стандартными средствами MFC.

Динамическая информация о классе (Run-time class information, RTCI) позволяет получить во время выполнения программы название класса и некоторую другую информацию об объекте. Механизм RTCI реализован независимо от механизма динамической идентификации типа (RTTI), встроенного в Си++. Во многом эти средства похожи, но RTCI был разработан на несколько лет раньше.

Диагностические и отладочные возможности CObject позволяют проверять состояние объектов подклассов CObject на выполнение некоторых условий корректности и выдавать дампы состояния объектов в отладочное окно Visual C++.

CObject предоставляет подклассам еще ряд полезных возможностей. Например, для защиты от утечек памяти в отладочном режиме в классе перегружены операторы new и delete. Если вы динамически создали объект подкласса CObject, и забыли удалить его до завершения программы, то MFC выдаст в отладочное окно Visual C++ предупреждающее сообщение.

1.5 Вспомогательные функции каркаса приложения

В MFC не все функции являются членами классов. Есть набор функций-утилит, существующих независимо от каких-либо классов. Они называются функциями каркаса приложения, их имена начинаются с Afx. Функции-члены классов можно вызывать только применительно к объектами этих классов, а функции каркаса приложения можно вызывать из любого места программы.

В табл. 4.1 перечислены несколько наиболее часто используемых функций AFX. AfxBeginThread упрощает создание новых исполняемых потоков. Функция AfxMessageBox является аналогом функции MessageBox из Windows API. Функции AfxGetApp и AfxGetMainWnd возвращают указатели на объект-приложение и на главное окно приложения. Они полезны, когда вы хотите вызвать функцию-член или обратиться к переменным этих объектов, но не знаете указателя на них. Функция AfxGetInstanceHandle позволяет получить дескриптор экземпляра EXE-файла для передачи его функции Windows API (в программах MFC иногда тоже приходится вызывать функции API).

Таблица. 4.1. Часто используемые функции семейства AFX

Имя функции

Назначение

AfxAbort

Безусловное завершение работы приложения (обычно при возникновении серьезной ошибки)

AfxBeginThread

Создает новый поток и начинает его исполнение

AfxEndThread

Завершает текущий исполняемый поток

AfxMessageBox

Выводит информационное окно Windows

AfxGetApp

Возвращает указатель на объект-приложение

AfxGetAppName

Возвращает имя приложения

AfxGetMainWnd

Возвращает указатель на главное окно приложения

AfxGetInstanceHandle

Возвращает дескриптор экземпляра EXE-файла приложения

AfxRegisterWndClass

Регистрирует пользовательский оконный класс WNDCLASS для использования в приложении MFC

2. Простейшее приложение на MFC

Конечно, в качестве простейшего примера рассмотрим модифицированное приложение "Hello, world" – "Hello, MFC". В нем будет продемонстрирован ряд особенностей разработки Windows-приложений на базе MFC:

·  наследование новых классов от MFC-классов CWinApp и CFrameWnd;

·  использование класса CPaintDC при обработке сообщения WM_PAINT.

·  применение карт сообщений.

Исходный текст приложения Hello приведен в виде фрагментов программы 4.1а и 4.1б. В заголовочном файле Hello. h содержатся описания двух унаследованных классов. В Hello. cpp размещена реализация этих классов.

Фрагмент программы 4.1а. Приложение Hello – заголовочный файл Hello. h

#if! defined( __HELLO_H )

# define __HELLO_H

class CMyApp : public CWinApp {

public:

 virtual BOOL InitInstance();

};

class CMainWindow : public CFrameWnd {

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32