Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Каркас приложений и библиотека классов
Один из секретов популярности языка C++ заключается в том, что его можно «расширять» библиотеками классов. Часть таких библиотек поставляется с компиляторами C++, часть продается независимыми фирмами, а какие-то библиотеки создаются программистами, так сказать, для внутреннего потребления. Библиотека классов – это набор взаимосвязанных классов C++, которые можно использовать в приложении. Математическая библиотека классов может выполнять наиболее распространенные математические операции, а библиотека коммуникационных классов — поддерживать обмен данными по последовательному каналу. Иногда Вы конструируете объекты из предлагаемых классов, иногда создаете из них собственные классы — все зависит от конструкции конкретной библиотеки. Каркас приложений — это надмножество библиотеки классов. Обычная библиотека представляет собой изолированный набор классов, предназначенных для использования в любой программе, а каркас приложений определяет структуру самой программы. Концепцию каркаса приложений изобрела не корпорация Microsoft — она сначала появилась в академических кругах, а первым коммерческим воплощением был МасАрр для Apple Macintosh. После появления MFC 2.0 реализацией подобных продуктов занялись и другие фирмы, в том числе Borland (Inprise). Пример на базе каркаса приложений Хватит общих рассуждений. Пора взглянуть на какой-нибудь код — не псевдокод, а настоящий, который действительно можно скомпилировать и выполнить с библиотекой MFC. Угадайте, какой? Ну конечно, это старая добрая программа «Hello, world!» правда, с некоторыми дополнениями. Кстати, это почти минимум кода, необходимого для Windows-приложения с применением библиотеки MFC. Не пытайтесь сразу же разобраться в каждой строке.
Ниже приведен исходный код для заголовочного файла и файла реализации (implementation file) нашего приложения MYAPP. Два класса — CMyApp и CMyFrame — порождены от базовых классов библиотеки MFC. Сначала взгляните на заголовочный файл MYAPP.H для приложения MYAPP: // Класс "приложение" Class СМуАрр: public CWinApp { public: virtual BOOL InitInstance(); }; // Класс "окно-рамка" Class CMyFrame : public CFrameWnd { public: CMyFrame(); protected: // ‘afx_msg’означает, что следующие две функции являются частью // системы распределения сообщений библиотеки MFC afx_msg void OnLButtonDown(UINT nFlags, Cpoint point); afx_msg void OnPaint(); DECLARE_MESSAGE_MAP() };
А вот файл реализации MYAPP.CPP для приложения MYAPP:
#include "afxwin.h"// Заголовочный файл библиотеки MFC объявляет // базовые классы СМуАрр theApp;/* Один-единственный объект СМуАрр. В Delphi ему соответствует объект Application */ BOOL CMyApp::InitInstance() { m_pMainWnd = new CMyFrame(); m_pMainWnd -> ShowWindow(m_nCmdShow); m_pMainWnd -> UpdateWindow(); return TRUE; } BEGIN_MESSAGE_MAP(CMyFrame, CFrameWnd) ON_WM_LBUTTONDOWN() ON_WM_PAINT() END_MESSAGE_MAP() CMyFrame::CMyFrame() { Create(NULL, “MYAPP Application”); } Void CMyFrame::OnLButtonDown( UINT nFlags, Cpoint point) { TRACE(“Входим в CMyFrame:: OnLButtonDown() - %lx, %d, %d\n”, (long) nFlags, point.x, point.y); } Void CMyFrame::OnPaint() { CPaintDC dc(this); dc.TextOut(0, 0, "Hello, World!”); }
Теперь обсудим некоторые элементы программы. Функция WinMain. Вспомните, что Windows требует наличия в любой программе функции WinMain (или main в консольных приложениях). Здесь Вы ее не видите потому, что она скрыта внутри каркаса приложения. Класс СМуАрр. Объект класса СМуАрр представляет программу. В программе определяется единственный глобальный объект класса СМуАрр — theApp. Базовый класс CWinApp определяет основные характеристики объекта theApp. Запуск приложения. При запуске приложения Windows вызывает встроенную в каркас приложения функцию WinMain, а та ищет глобально сконструированный объект класса, производный от CWinApp, т.е. theApp. He забудьте, что в программах на C++ глобальные объекты конструируются перед исполнением основной части программы. Функция-член CMyApp::InitInstance(). Когда Windows находит объект-приложение, она вызывает его виртуальную функцию-член InitInstance(), которая делает вызовы, необходимые для создания и отображения на экране основного окна-рамки программы (application's main frame window). Вы должны переопределить Initlnstance() в своем производном классе приложение, так как класс не имеет ни малейшего представления о том, какого типа основное окно-рамку Вы хотите создать. Функция-член CWinApp::Run. Функция Run скрыта в базовом классе, но она распределяет сообщения программы между ее окнами, обеспечивая тем самым работу этой программы. WinMain вызывает Run после вызова Initlnstance. Класс CMyFrame. Объект класса CMyFrame представляет основное окно программы. Когда конструктор вызывает функцию-член Create базового класса CFrameWnd, Windows создает действительную оконную структуру, а каркас приложения связывает ее с С++ объектом. Для вывода окна на экран вызываются функции ShowWindow и UpdateWindow (также функции-члены базового класса). Функция CMyFrame::OnLButtonDown. Она включена для демонстрации возможностей обработки сообщений в библиотеке MFC. Мы объявляем о сопоставлении события «нажатие левой кнопки мыши» с функцией-членом класса CMyFrame. Подробнее о сопоставлении сообщений в библиотеке MFC мы поговорим в следующих главах, а пока просто примем к сведению, что эта функция вызывается при нажатии левой кнопки мыши. Функция использует макрос TRACE из библиотеки MFC, чтобы вывести сообщение в отладочное окно Debug – и только! Функция CMyFrame::OnPaint. Каркас приложений вызывает эту функцию-член класса CMyFrame всякий раз, когда надо перерисовать окно — в начале работы программы, при изменении размеров окна и при обновлении всего окна или его части. Класс CPaintDC относится к GDI и поясняется в следующих главах. Ну, а функция TextOut выводит на экран «Hello, World!». Завершение приложения. Пользователь завершает приложение, закрывая основное окно программы. Тем самым он инициирует последовательность событий, заканчивающихся уничтожением объекта класса CMyFrame, выходом из Run, выходом из WinMain и уничтожением объекта класса CMyApp. Еще раз взгляните на пример и попробуйте теперь представить всю картину целиком. Очевидно, что большая часть функциональных возможностей программы сосредоточена в базовых классах библиотеки MFC: CWinApp и CFrameWnd. Составляя MYAPP, мы следовали нескольким простым правилам структуризации и поместили ключевые функции в производные классы. Как видите, C++ позволяет «заимствовать» большие объемы кода, не копируя его. Считайте это партнерскими отношениями между нами и каркасом приложений. Последний создает структуру программы, а мы — код, наполняющий эту структуру. Теперь Вы, наверное, начинаете понимать, почему каркас приложения нечто большее, чем библиотека классов. Он определяет не только структуру программы — его роль значительнее, чем у базовых классов C++. Вы уже видели в действии скрытую функцию WinMain, а прочие компоненты каркаса поддерживают обработку сообщений, динамически подключаемые библиотеки DLL и другое. |
|||
Последнее изменение этой страницы: 2018-04-12; просмотров: 507. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |