Визуальное программирование и MFC

       

Класс документа


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

Если просмотреть исходные тексты приложения, то нигде нельзя обнаружить кода, который бы явно создавал объекты этого класса. Объект класса CSingleDoc создается динамически шаблоном документа во время работы приложения. Шаблон документа также динамически создает еще два объекта - класса окна и класса окна просмотра.

Для того, чтобы объекты любого класса, наследованного от базового класса CObject, в том числе и CSingleDoc, можно было создавать динамически, необходимо выполнить следующее:

  • макрокоманду DECLARE_DYNCREATE надо поместить в описание класса. В качестве параметра этой макрокоманды необходимо указать имя данного класса;
  • определить конструктор класса, который не имеет параметров;
  • разместить макрокоманду IMPLEMENT_DYNCREATE в файле реализации класса. Макрокоманда IMPLEMENT_DYNCREATE имеет два параметра. В первом указывается имя класса, а во втором - имя его базового класса.
  • MFC AppWizard автоматически выполняет все эти требования для класса документа приложения CSingleDoc, класса окна приложения CMainFrame и класса окна просмотра CSingleView.

    Таблица сообщений класса. Макрокоманда IMPLEMENT_DYNCREATE размещается в файле реализации класса singleDoc.cpp. Обычно MFC AppWizard размещает эту макрокоманду непосредственно перед таблицей сообщений класса (если, конечно, данный класс обрабатывает сообщения).

    Непосредственно после создания проекта таблица сообщений класса CSingleDoc не содержит обработчиков сообщений. Когда приложение будет разрабатываться дальше, программист может добавлять обработчики различных сообщений к классу CSingleDoc и другим классам приложения. Для добавления новых обработчиков сообщений, а также внесения других изменений в классы, следует использовать ClassWizard.

    Конструктор и деструктор класса. Конструктор, подготовленный MFC AppWizard, содержит пустой блок. Можно поместить в него код инициализации для объектов класса.




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



    Вместе с конструктором класса CSingleDoc, создается деструктор ~CSingleDoc. Деструктор не содержит кода и представляет собой такую же заготовку, как и конструктор.



    Методы OnNewDocument и Serialize.
    В классе CSingleDoc переопределены два виртуальных метода: OnNewDocument и Serialize. Виртуальный метод OnNewDocument определен в классе CDocument, от которого непосредственно наследуется класс CSingleDoc. А вот виртуальный метод Serialize определен в классе CObject. Цепочка наследования в этом случае длиннее.

    Метод OnNewDocument вызывается, когда нужно создать новый документ для приложения. Если метод OnNewDocument переопределяется (в данном случае это делает MFC AppWizard), то сначала необходимо вызвать метод OnNewDocument базового класса и только затем можно выполнять инициализацию документа.

    Если создание нового документа прошло успешно, метод OnNewDocument должен вернуть значение TRUE, в противном случае - FALSE. Когда вызывается метод OnNewDocument базового класса, следует выполнять проверку возвращаемого им значения. Если это значение равно FALSE, значит создание документа на уровне класса CDocument не прошло и следует прекратить дальнейшие действия.

    Большой интерес представляет метод Serialize. Он вызывается в тех случаях, когда нужно загрузить документ из файла на диске или, наоборот, записать его в файл. Метод Serialize вызывается, когда пользователь выбирает из меню File строки Open или Save.

    В качестве параметра методу Serialize передается указатель на объект класса СArchive, связанный с файлом, в который надо записать или из которого надо прочитать документ.

    Метод Serialize вызывается и для загрузки и для сохранения документа. Чтобы узнать, что надо делать с документом , используется метод IsStoring класса CArchive .Если он возвращает ненулевое значение, значит, необходимо сохранить состояние документа в файле. В противном случае нужно считать документ из файла.



    Методы AssertValid и Dump.
    Класс CSingleDoc содержит переопределения еще двух виртуальных методов: AssertValid и Dump, входящих в базовый класс CObject.

    Следует обратить внимание на то, что описание этих методов и их определение находится в блоке #ifdef _DEBUG. Поэтому эти методы используются только для отладочной версии приложения. При окончательном построении приложения эти методы не переопределяются.


    Содержание раздела