|
Программирование >> Процедурные приложения
Глава 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:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |