Microsoft visual C++ и MFC.© Александр Фролов, Григорий ФроловТом 24, М.: Диалог-МИФИ, 1993. Самый базовый класс MFC (класс CObject)Подавляющее большинство классов библиотеки MFC наследовано от базового класса CObject, лежащего в основе всей иерархии классов этой библиотеки. Методы и элементы данных класса CObject XE "CObject" представляют наиболее общие свойства наследованных из него классов MFC. Класс CObject, а также все классы, наследованные от него, обеспечивают возможность сохранения объектов класса в файлах на диске с их последующим восстановлением. Для объектов классов, наследованных от базового класса CObject уже во время работы приложения можно получить разнообразную информацию о классе объекта. Ряд методов класса CObject предназначен для получения дампа объектов класса во время отладки приложения. Эта особенность класса может ускорить процесс поиска ошибок в приложении. Основа структуры приложения (класс CCmdTarget)Непосредственно от класса CObject наследуются ряд классов, которые сами являются базовыми для остальных классов MFC. В первую очередь это класс CCmdTarget XE "CCmdTarget" , представляющий основу структуры любого приложения. Основной особенностью класса CCmdTarget и классов, наследованных от него является то, что объекты этих классов могут получать от операционной системы сообщения и обрабатывать их. Структура классов, связанных с классом CCmdTarget представлена на рисунке 2.2. Рис. 2.2. Класс CCmdTarget Подзадачи приложения (классы CWinThread и CWinApp)От класса CCmdTarget наследуется класс CWinThread XE "CWinThread" , представляющий подзадачи приложения. Простые приложения, которые мы будем рассматривать в первой книге, посвященной MFC, имеют только одну подзадачу. Эта подзадача, называемая главной, представляется классом CWinApp XE "CWinApp" , наследованным от класса CWinThread. Документ приложения (класс CDocument)Большинство приложений работают с данными или документами, хранимыми на диске в отдельных файлах. Класс CDocument XE "CDocument" , наследованный от базового класса CCmdTarget, служит для представления документов приложения. Шаблон документов (классы CDocTemplate, CSingleDocTemplate и CMultiDocTemplate)Еще один важный класс, наследуемый от CCmdTarget, называется CDocTemplate XE "CDocTemplate" . От этого класса наследуются два класса CSingleDocTemplate XE "CSingleDocTemplate" и CMultiDocTemplate XE "CMultiDocTemplate" . Все эти классы предназначены для синхронизации и управления основными объектами представляющими приложение - окнами, документами и используемыми ими ресурсами. Окна (класс CWnd)Практически все приложения имеют пользовательский интерфейс, построенный на основе окон. Это может быть диалоговая панель, одно окно или несколько окон, связанных вместе. Основные свойства окон представлены классом CWnd XE "CWnd" , наследованным от класса CCmdTarget. Вы очень редко будете создавать объекты класса CWnd. Класс CWnd сам является базовым классом для большого количества классов, представляющих разнообразные окна. На рисунке 2.3 представлена только небольшая часть дерева наследования класса CWnd. Рис. 2.3. Класс CWnd Перечислим классы, наследованные от базового класса CWnd. · Обрамляющие окна (класс CFrameWnd) Класс CFrameWnd XE "CFrameWnd" представляет окна, выступающие в роли обрамляющих окон (frame window), в том числе главные окна приложения. От этого класса также наследуются классы CMDIChildWnd XE "CMDIChildWnd" и CMDIFrameWnd XE "CMDIFrameWnd" , используемые для отображения окон многооконного интерфейса MDI. Класс CMDIFrameWnd представляет главное окно приложения MDI, а класс CMDIChildWnd - его дочерние окна MDI. Класс CMiniFrameWnd XE "CMiniFrameWnd" применяется для отображения окон уменьшенного размера. Такие окна обычно используются для отображения в них панели управления. · Окна органов управления В предыдущих томах серии “Библиотека системного программиста” мы рассказывали о том, что существует ряд органов управления, встроенных в операционную систему. К ним относятся кнопки, полосы прокрутки, редакторы текста, переключатели и т. д. Для работы с этими органами управления в библиотеке MFC предусмотрены специальные классы, наследованные непосредственно от класса CWnd XE "CWnd" .
· Управляющие панели (классы CControlBar XE "CControlBar" , CStatusBar XE "CStatusBar" , CDialogBar XE "CDialogBar" ) Класс CControlBar и классы, наследуемые от него, предназначены для создания управляющих панелей. Такие панели могут содержать различные органы управления и отображаются как правило в верхней или нижней части главного окна приложения. Так, класс CStatusBar предназначен для создания панели управления. Эта панель обычно содержит ряд кнопок, дублирующих действие меню приложения. Класс CStatusBar управляет панелью состояния. Панель состояния отображается в виде полосы в нижней части экрана. В ней приложение может отображать всевозможную информацию, например краткую подсказку о выбранной строке меню. Большие возможности представляет управляющая панель, созданная на основе класса CDialogBar. Такая панель использует обычный шаблон диалоговой панели, который вы можете разработать в редакторе ресурсов Visual C++. · Блокнот (класс CPropertySheet) Класс CPropertySheet XE "CPropertySheet" представляет блокнот - диалоговую панель, содержащую несколько страниц. Отдельные страницы такого блокнота управляются объектами другого класса - CPropertyPage. Класс CPropertyPage XE "CPropertyPage" наследуется от базового класс CDialog, который мы рассмотрим ниже. · Окна просмотра (класс CView XE "CView" и классы наследованные от него) Большой интерес представляет класс CView и классы, наследуемые от него (рис. 2.4). Эти классы представляют окно просмотра документов приложения. Именно окно просмотра используется для вывода на экран документа, с которым работает приложения. Через это окно пользователь может изменять документ. Разрабатывая приложение, вы будете наследовать собственные классы просмотра документов либо от базового класса CView, либо от одного из нескольких порожденных классов, определенных в библиотеке MFC. Классы, наследованные от CCtrlView XE "CCtrlView" , используют для отображения документа готовые органы управления. Например, класс CEditView XE "CEditView" использует орган управления edit (редактор). Более подробно эти классы будут описаны позже, когда мы будем рассказывать о средствах автоматизированного программирования MFC AppWizard и ClassWizard. Класс CScrollView XE "CScrollView" представляет окно просмотра, которое имеет полосы свертки. В классе определены специальные методы, управляющие полосами просмотра Класс CFormView XE "CFormView" позволяет создать окно просмотра документа, основанное на диалоговой панели. От этого класса наследуются еще два класса CRecordView XE "CRecordView" и CDaoRecordView XE "CDaoRecordView" . Эти классы используются для просмотра записей баз данных. Рис. 2.4. Класс CView · Диалоговые панели (класс CDialog XE "CDialog" и классы наследованные от него) Кроме перечисленных классов от базового класса CWnd наследуются классы, управляющие диалоговыми панелями. Если вы желаете создать диалоговую панель, вы можете наследовать класс от CDialog (рис. 2.5). Вместе с диалоговыми панелями обычно используется класс CDataExchange XE "CDataExchange" . Класс CDataExchange XE "CDataExchange" обеспечивает работу процедур обмена данными DDX XE "DDX" (Dialog Data Exchange XE "Dialog Data Exchange" ) и проверки данных DDV XE "DDV" (Dialog Data Validation XE "Dialog Data Validation" ) используемых для диалоговых панелей. В отличие от класса CDialog, класс CDataExchange не наследуется от какого-либо другого класса. Когда вы создаете блокнот, состоящий из нескольких страниц, то каждая такая страница является объектом класса, наследованного от CPropertyPage XE "CPropertyPage" . От класса CDialog XE "CDialog" наследуется ряд классов, представляющих собой стандартные диалоговые панели для выбора шрифта, цвета, вывода документа на печать, поиска в документе определенной последовательности символов, а также поиска и замены одной последовательности символов другой последовательностью. Чтобы создать стандартный диалог, вы можете просто определить объект соответствующего класса. Дальнейшее управление такой панелью осуществляется методами класса. Рис. 2.5. Класс CDialog Исключения (класс CException)Для реализации механизма исключений в MFC определен специальный класс CException XE "CException" , наследованный от базового класса CObject. Все исключения, определенные в MFC, наследуются от этого класса. Вот список классов, наследованных от CException и их краткое описание. Более полное описание классов, связанных с исключениями, вы можете найти в разделе “Исключения - класс CException” главы “Вспомогательные классы MFC”.
Массивы, списки и словариВ состав MFC включен целый набор классов, предназначенных для хранения информации в массивах, списках и словарях. Все эти классы наследованы от базового класса CObject. Не смотря на то, что в языке Си определено понятие массива, классы MFC обеспечивают вам более широкие возможности. Вы, например, можете динамически изменять размер массива, определенного с помощью соответствующего класса. Для представления массивов предназначены следующие классы.
Фактически все перечисленные в таблице классы различаются только типом элементов массива. Поэтому вместо использования этих классов гораздо проще воспользоваться шаблоном XE "шаблон" CArray XE "CArray" . Используя шаблон CArray, вы можете определять массивы из элементов любых типов и классов. Шаблон CArray наследует свойства класса CObject. Для построения массивов вы можете также воспользоваться шаблоном CTypedPtrArray XE "CTypedPtrArray" . Этот шаблон не наследуется от базового класса CObject, поэтому использовать методы класса CObject для него нельзя. Для решения многих задач используются такие структуры хранения данных, как списки. MFC включает ряд классов, наследованных от базового класса CObject, которые предоставляют программисту готовое средство для создания собственных списков. В этих классах определены все методы необходимые при работе со списками - добавление нового элемента, вставка нового элемента, определение следующего или предыдущего элемента в списке, удаление элемента и т. д.
Перечисленные в таблице классы позволяют построить списки из элементов любых типов и объектов любых классов. Однако удобнее пользоваться шаблоном CList XE "CList" , также наследованным от базового класса CObject. Для построения списков вы можете также использовать шаблон CTypedPtrList XE "CTypedPtrList" . Этот шаблон не наследуется от базового класса CObject. В библиотеке классов MFC определена еще одна группа классов, позволяющая создавать словари. Словарь представляет собой таблицу из двух колонок, устанавливающую соответствие двух величин. Первая величина представляет ключевое значение и записывается в первую колонку таблицы, а вторая связанное с ней значение, хранящееся во второй колонке. Словарь позволяет добавлять в него пары связанных величин и осуществлять выборку значений по ключевому полю.
Вы можете создавать словари, имеющие поля любых типов и классов, если воспользуетесь шаблоном CMap XE "CMap" . Шаблон CMap наследуется от базового класса CObject. Для построения словарей можно также использовать шаблон CTypedPtrMap XE "CTypedPtrMap" . Шаблон CTypedPtrMap не наследуется от базового класса CObject. Файловая система (класс CFile)Библиотека MFC включает класс для работы с файловой системой компьютера. Он называется CFile XE "CFile" и также наследуется от базового класса CObject. Непосредственно от класса CFile наследуются еще несколько классов - CMemFile XE "CMemFile" , CStdioFile XE "CStdioFile" , CSocketFile XE "CSocketFile" . При работе с файловой системой вам может потребоваться получить различную информацию о некотором файле - например, дату создания, размер и т. д. Для хранения этих данных предназначен специальный класс CFileStatus. Класс CFileStatus один из немногих классов, которые не наследуются от базового класса CObject. Контекст отображения (класс CDC)Для отображения информации в окне или на любом другом устройстве приложение должно получить так называемый контекст отображения. Основные свойства контекста отображения определены в классе CDC XE "CDC" . От него наследуется четыре различных класса, представляющие контекст отображения различных устройств (рис. 2.6). Рис. 2.6. Класс CDC В следующей таблице приведено краткое описание классов, наследованных от CDC.
Объекты графического интерфейса (класс CGdiObject)Для отображения информации используются различные объекты графического интерфейса - GDI объекты. Для каждого из этих объектов библиотека MFC содержит описывающий его класс, наследованный от базового класса CGdiObject XE "CGdiObject" (рис. 2.7). Рис. 2.7. Класс CGdiObject
Меню (класс CMenu)Практически каждое приложение имеет собственное меню. Оно как правило отображается в верхней части главного окна приложения. Для управления меню в состав MFC включен специальный класс CMenu XE "CMenu" , наследованный непосредственно от базового класса CObject. Для управления меню и панелями управления используется также класс CCmdUI XE "CCmdUI" . Этот класс не наследуется от базового класса CObject. Объекты класса CCmdUI создаются, когда пользователь выбирает строку меню или нажимает кнопки панели управления. Методы класса CCmdUI позволяют управлять строками меню и кнопками панели управления. Так например, существует метод, который делает строку меню неактивной. Базы данных (классы для работы с базами данных)В MFC включены несколько классов, обеспечивающую поддержку приложений, работающих с базами данных. В первую очередь это классы ориентированные на работу с ODBC драйверами - CDatabase XE "CDatabase" и CRecordSet XE "CRecordSet" . Поддерживаются также новые средства для работы с базами данных DAO (Data Access Object). Для этого предназначены классы CDaoDatabase XE "CDaoDatabase" , CDaoRecordSet XE "CDaoRecordSet" , . CDaoQueryDef XE "CDaoQueryDef" , CDaoTableDef XE "CDaoTableDef" , CDaoWorkspace XE "CDaoWorkspace" и CLongBinary XE "CLongBinary" . Для работы с базами данных также предназначены классы CFieldExchange и CDaoFieldExchange. Это самостоятельные классы, они не наследуются от базового класса CObject. Классы CFieldExchange XE "CFieldExchange" и CDaoFieldExchange XE "CDaoFieldExchange" работают с процедурами обмена данными RFX XE "RFX" (Record Field Exchange XE "Record Field Exchange" ) для классов управляющих базами данных. Синхронизация задач приложения (класс CSyncObject)Библиотека MFC позволяет создавать многозадачные приложения. Для синхронизации отдельных задач приложения предусмотрен ряд специальных классов. Все они наследуются от класса CSyncObject XE "CSyncObject" , представляющего собой абстрактный класс (рис. 2.8). Рис. 2.8. Класс CSyncObject В некоторых случаях требуется, чтобы участок программного кода мог выполняться только одной задачей. Такой участок называют критической секцией кода. Для создания и управления критическими секциями предназначены объекты класса CCriticalSection XE "CCriticalSection" . Объекты класса CEvent XE "CEvent" представляют событие. При помощи событий одна задача приложения может передать сообщение другой. Объекты класса CMutex XE "CMutex" позволяют в данный момент времени представить ресурс в пользование только одной задачи. Остальным задачам доступ к ресурсу запрещается. Объекты класса CSemaphore XE "CSemaphore" представляют собой семафоры. Семафоры позволяют ограничить количество задач, которые имеют доступ к какому-либо ресурсу. Сокеты (классы CAsyncSocket и CSocket)Для тех, кто занимается сетевыми коммуникациями, в состав библиотеки MFC включены классы CAsyncSocket XE "CAsyncSocket" и наследованный от него класс CSocket XE "CSocket" (рис. 2.9). В класс CAsyncSocket включен программный интерфейс Windows Socket. Класс CSocket предоставляет программисту более высокий уровень для работы с сокетами. Это значительно облегчает задачу программирования сетевых приложений. Программирование на уровне программного интерфейса Windows с использованием сокетов описано в двадцать третьем томе серии “Библиотека системного программиста”, который называется “Глобальные сети компьютеров”. Рис. 2.9. Класс CAsyncSocket |