Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

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" .

Класс

Орган управления

CAnimateCtrl XE "CAnimateCtrl"

Используется для отображения видеоинформации

CBitmapButton XE "CBitmapButton"

Кнопка с рисунком

CButton XE "CButton"

Кнопка

CComboBox XE "CComboBox"

Список с окном редактирования

CEdit XE "CEdit"

Поле редактирования

CHeaderCtrl XE "CHeaderCtrl"

Заголовок для таблицы

CHotKeyCtrl XE "CHotKeyCtrl"

Предназначен для ввода комбинации клавиш акселераторов

CListBox XE "CListBox"

Список

CListCrtl XE "CListCrtl"

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

CProgressCtrl XE "CProgressCtrl"

Линейный индикатор

CPropertySheet XE "CPropertySheet"

Блокнот. Может состоять из нескольких страниц

CRichEditCtrl XE "CRichEditCtrl"

Окно редактирования, в котором можно редактировать форматированный текст

CScrollBar XE "CScrollBar"

Полоса просмотра

CSliderCtrl XE "CSliderCtrl"

Движок

CSpinButtonCtrl XE "CSpinButtonCtrl"

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

CStatic XE "CStatic"

Статический орган управления

CTabCtrl XE "CTabCtrl"

Набор “закладок”

CToolBarCtrl XE "CToolBarCtrl"

Панель управления

CToolTipCtrl XE "CToolTipCtrl"

Маленькое окно содержащее строку текста

CTreeCtrl XE "CTreeCtrl"

Орган управления, который позволяет просматривать иерархические структуры данных

·         Управляющие панели (классы 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”.

Класс

Описание

CArchiveException XE "CArchiveException"

Исключение, вызванное ошибкой при использовании объекта класса CArchive. Класс CArchive применяется для сохранения и загрузки документа из файла на диске

CDaoException XE "CDaoException"

Ошибка при работе с базами данных (при использовании классов DAO)

CDBException XE "CDBException"

Ошибка при работе с базами данных (при использовании ODBC)

CFileException XE "CFileException"

Ошибка, связанная с файловой системой

CMemoryException XE "CMemoryException"

Недостаточно оперативной памяти

CNotSupportedException XE "CNotSupportedException"

Попытка выполнить неопределенную операцию

COleDispatchException XE "COleDispatchException" , COleException

Ошибка OLE

CResourceException XE "CResourceException"

Не найден ресурс

CUserException XE "CUserException"

Ошибка приложения, вызванная действиями пользователя

Массивы, списки и словари

В состав MFC включен целый набор классов, предназначенных для хранения информации в массивах, списках и словарях. Все эти классы наследованы от базового класса CObject.

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

Для представления массивов предназначены следующие классы.

Класс

Массив содержит

CByteArray XE "CByteArray"

Байты

CDWordArray XE "CDWordArray"

Двойные слова

CObArray XE "CObArray"

Указателей на объекты класса CObject

CPtrArray XE "CPtrArray"

Указателей типа void

CStringArray XE "CStringArray"

Объекты класса CString XE "CString"

CUIntArray XE "CUIntArray"

Элементы класса unsigned integer или UINT

CWordArray XE "CWordArray"

Слова

Фактически все перечисленные в таблице классы различаются только типом элементов массива. Поэтому вместо использования этих классов гораздо проще воспользоваться шаблоном XE "шаблон" CArray XE "CArray" . Используя шаблон CArray, вы можете определять массивы из элементов любых типов и классов. Шаблон CArray наследует свойства класса CObject.

Для построения массивов вы можете также воспользоваться шаблоном CTypedPtrArray XE "CTypedPtrArray" . Этот шаблон не наследуется от базового класса CObject, поэтому использовать методы класса CObject для него нельзя.

Для решения многих задач используются такие структуры хранения данных, как списки. MFC включает ряд классов, наследованных от базового класса CObject, которые предоставляют программисту готовое средство для создания собственных списков. В этих классах определены все методы необходимые при работе со списками - добавление нового элемента, вставка нового элемента, определение следующего или предыдущего элемента в списке, удаление элемента и т. д.

Класс

Список содержит элементы

CObList XE "CObList"

Указатели на объекты класса CObject

CPtrList XE "CPtrList"

Указатели типа void

CStringList XE "CStringList"

Объекты класса CString

Перечисленные в таблице классы позволяют построить списки из элементов любых типов и объектов любых классов. Однако удобнее пользоваться шаблоном CList XE "CList" , также наследованным от базового класса CObject. Для построения списков вы можете также использовать шаблон CTypedPtrList XE "CTypedPtrList" . Этот шаблон не наследуется от базового класса CObject.

В библиотеке классов MFC определена еще одна группа классов, позволяющая создавать словари. Словарь представляет собой таблицу из двух колонок, устанавливающую соответствие двух величин. Первая величина представляет ключевое значение и записывается в первую колонку таблицы, а вторая связанное с ней значение, хранящееся во второй колонке. Словарь позволяет добавлять в него пары связанных величин и осуществлять выборку значений по ключевому полю.

Класс

Ключевое поле

Поле, связанное с ключевым

CMapPtrToPtr XE "CMapPtrToPtr"

Указатель типа void

Указатель типа void

CMapPtrToWord XE "CMapPtrToWord"

Указатель типа void

Слово

CMapStringToOb XE "CMapStringToOb"

Объекты класса CString

Указатели на объекты класса CObject

CMapStringToPtr XE "CMapStringToPtr"

Объекты класса CString

Указатель типа void

CMapStringToString XE "CMapStringToString"

Объекты класса CString

Объекты класса CString

CMapWordToOb XE "CMapWordToOb"

Слово

Указатели на объекты класса CObject

CMapWordToPtr XE "CMapWordToPtr"

Слово

Указатель типа void

Вы можете создавать словари, имеющие поля любых типов и классов, если воспользуетесь шаблоном 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.

Класс

Описание

CClientDC XE "CClientDC"

Контекст отображения, связанный с внутренней областью окна (client area). Для получения контекста конструктор класса вызывает функцию программного интерфейса GetDC XE "GetDC" , а деструктор - функцию ReleaseDC XE "ReleaseDC"

CMetaFileDC XE "CMetaFileDC"

Класс предназначен для работы с метафайлами

CPaintDC XE "CPaintDC"

Конструктор класса CPaintDC для получения контекста отображения вызывает метод CWnd::BeginPaint, деструктор метод CWnd::EndPaint. Объекты данного класса могут использовать только при обработке сообщения WM_PAINT. Это сообщение обычно обрабатывает метод OnPaint

CWindowDC XE "CWindowDC"

Контекст отображения, связанный со всем окном. Для получения контекста конструктор класса вызывает функцию программного интерфейса GetWindowDC, а деструктор - функцию ReleaseDC

Объекты графического интерфейса (класс CGdiObject)

Для отображения информации используются различные объекты графического интерфейса - GDI объекты. Для каждого из этих объектов библиотека MFC содержит описывающий его класс, наследованный от базового класса CGdiObject XE "CGdiObject" (рис. 2.7).

Рис. 2.7. Класс CGdiObject

Класс

Описание

CBitmap XE "CBitmap"

Растровое изображение bitmap

CBrush XE "CBrush"

Кисть

CFont XE "CFont"

Шрифт

CPalette XE "CPalette"

Палитра цветов

CPen XE "CPen"

Перо

CRgn XE "CRgn"

Область внутри окна

Меню (класс 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

[Назад] [Содеожание] [Дальше]