Программирование >>  Процедурные приложения 

1 ... 101 102 103 [ 104 ] 105 106 107 ... 150


Глава 18. Основы библиотеки MFC

Зачем нужны библиотеки классов

Принципы, лежащие в основе MFC

Ключевые особенности MFC

Все начинается с CObject

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

Простейшее MFC -приложение

o Файл SIMPLE.CPP

o Файл AFXWIN.H

o Создание класса, производного от CWinApp

o Класс CFrameWnd

o Реализация метода Initlnstance()

o Конструктор

o Запуск программы

Из предыдущих глав вы узнали, что создание даже самых простых приложений Windowsс использованием стандартных API-функций является довольно сложной задачей, требующей много времени и внимания. Например, код простейшего приложения SWP.C(мы рассматривали его в предыдущей главе) на языке С занял почти две страницы текста. Большая часть кода нужна лишь для того, чтобы вывести на экран окно приложения и поддерживать его работу.

Компилятор MicrosoftVisualC++ предлагает мощную библиотеку классов (MicrosoftFoundationClasses- MFC ), предназначенную для разработки 32-разрядных приложений, отвечающих всем стандартам и требованиям сегодняшнего дня. В MFC инкапсулированы все API-функции Windowsи дополнительно обеспечивается поддержка панелей инструментов, страниц свойств, технологии OLE, элементов управления ActiveXи многое другое. Кроме того, имеются функции управления базами данных, основанными на разных источниках данных, включая ОАО и ODBC. Поддерживается и разработка приложений для Internet.

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

Зачем нужны библиотеки классов

MFC предоставляет программистам удобные классы объектов, в которых инкапсулированы все наиболее важные структуры и API-функции. Библиотеки классов, подобные MFC , обеспечивают гораздо больше возможностей и значительно проще в использовании, чем традиционные библиотеки функций языка С, о которых говорилось в двух предыдущих главах.

Ниже перечислены основные преимущества использования библиотек классов:

устраняются конфликты, связанные с совпадением имен стандартных и программных функций, а также переменных;



код и данные инкапсулируются в классах, и доступ к ним может быть ограничен;

обеспечивается наследование кода;

размер кода значительно сокращается.

Благодаря MFC код, требуемый для отображения окна приложения (мы рассматривали его в предыдущей главе), можно сократить примерно в три раза. При этом программист получает возможность уделять больше времени и внимания не разработке процедур взаимодействия приложения с Windows, а реализации тех задач, для решения которых и создается приложение.

Принципы, лежащие в основе MFC

Создатели MFC при разработке данного продукта придерживались строгих правил и стандартов. Основные принципы, на которых базируется MFC , перечислены ниже:

возможность комбинировать обычные вызовы функций с использованием методов классов;

баланс между производительностью и эффективностью базовых классов;

преемственность в переходе от использования API-функций к библиотеке классов;

простота переноса библиотеки классов на разные платформы: от Windows3.1 к Windows 95/NT, затем к Windows98 и т.д.;

органичная взаимосвязь с традиционными средствами программирования на C++, позволяющая избежать чрезмерного усложнения программного кода.

Создатели библиотеки осознавали, что от совершенства ее программного кода зависит эффективность работы приложения, основанного на MFC . Четко соблюдались требования к размеру классов и быстроте выполнения их методов. В результате по скорости работы классы MFC ничем не уступают библиотечным функциям языка С.

Одна из поставленных перед разработчиками MFC задач состояла в том, чтобы программисты, уже знакомые с API-функциями, не заучивали новый, далеко не малый набор имен функций и констант. Это требование строго соблюдалось при именовании членов классов. Данная особенность выгодно отличает MFC от других библиотек классов.

При создании MFC также учитывалась возможность работы в смешанном режиме. Другими словами, в одной программе могут применяться как библиотека MFC , так и API-функции. Некоторые функции, например SetCursor() и GetSystemMetrics(), должны вызываться напрямую, даже если в приложении используется MFC . Еще одно важное свойство, на которое обращали внимание разработчики Microsoft, - это возможность непосредственного использования базовых классов в программах. Существовавшие до MFC библиотеки классов были чересчур абстрактными. В Microsoft их называли тяжелыми классами , поскольку основанные на них приложения отличались большим размером программного кода и недостаточно быстро выполнялись. Разработчикам MFC удалось найти золотую середину между разумным уровнем абстрактности и размером кода.

Ключевые особенности MFC

Ниже перечислены основные достоинства библиотеки MFC .

Расширенная система обработки исключительных ситуаций, благодаря которой приложения менее чувствительны к ошибкам и сбоям. Ошибки типа нехватка памяти обрабатываются автоматически.

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

о 1 о



Полная поддержка всех API-функций, элементов управления, сообщений, GDI, графических примцшвов, меню и диалоговых окон.

Возможность определить тип объекта во время выполнения программы. Это позволяет осуществлять динамическое управление переменными-членами в случае использования разных экземпляров класса.

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

Небольшой размер и быстрота выполнения программного кода классов. Как уже говорилось выше, по этим показателям MFC не уступает стандартным библиотечным функциям языка С.

Поддержка COM (ComponentObjectModel- модель компонентных объектов).

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

Опытный программист сразу же оценит две наиболее важные особенности MFC : знакомые имена методов и привязка сообщений к обработчикам. Если вы вернетесь к программе PIE.C, рассмотренной в предыдущей главе, то убедитесь в обилии блоков switch/case. Увлечение такими конструкциями чревато возникновением трудно обнаруживаемых ошибок при выполнении программы. Эту проблему легко обойти с помощью MFC .

Профессиональный разработчик будет удовлетворен быстротой выполнения про-фаммного кода библиотечных классов. Интенсивное использование MFC теперь не щшведет к тяжеловесности полученного приложения.

Все начинается с CObject

Большинство библиотек классов, в том числе и MFC , имеют какой-нибудь один общий родительский класс, от которого порождаются все остальные. В MFC таковым является CObject. Ниже показано описание этого класса, взятое из файла AFX.H. (Файлы заголовков библиотеки MFC хранятся в папке MFC /INCLUDE.)

/ Класс CObject является базов1м для классов MFC class CObject

public:

Модель объекта (проверка типа, в1деление памяти, уничтожение) virtual CRuntimeClass* GetRuntimeClass0

const/virtual -CObject (); необходим виртуальный деструктор Резервирование и удаление памяти void* PASCAL operator new(size t nSize); void* PASCAL operator new(size t, void* p) ; void PASCAL operator delete(void* p) ;

fif defined( DEBUG) && ! defined ( AFX NO DEBUG CRT) ?, позволяет отслеживать имя файла и номер строки ( используется при отладке)

void* PASCAL operator new(size t nSize, LPCSTR IpszFileName, intnLine); #endif

Конструктор копирования и оператор инициализации с присваиванием

недоступны, поэтому в случае попытки использовать соответствующие

конструкции будет выдано сообщение об ошибке компилятора,

что позволит избежать непредсказуемости выполнения программы.

protected: CObject ();

private:



1 ... 101 102 103 [ 104 ] 105 106 107 ... 150

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика