Поделиться через


TN025: Создание документа, вида и кадра

Замечание

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

В этом примечании описываются аспекты создания и владения для WinApps, DocTemplates, Documents, Frames и Views.

WinApp

В системе есть один CWinApp объект.

Она статически создается и инициализируется внутренней реализацией WinMain фреймворка. Вам необходимо унаследовать от CWinApp, чтобы сделать что-либо полезное (исключение: расширяемые DLL библиотеки MFC не должны иметь экземпляр CWinApp — инициализация выполняется вместо этого в DllMain).

CWinApp Один объект владеет списком шаблонов документов (aCPtrList). Для каждого приложения существует один или несколько шаблонов документов. DocTemplates обычно загружаются из файла ресурсов (т. е. строкового массива) в CWinApp::InitInstance.

pTemplate = new CDocTemplate(IDR_MYDOCUMENT, ...);

AddDocTemplate(pTemplate);

Один CWinApp объект владеет всеми окнами кадров в приложении. Главное окно фрейма для приложения должно храниться в CWinApp::m_pMainWnd; обычно вы устанавливаете m_pMainWnd в реализации InitInstance, если не позволили AppWizard сделать это за вас. Для единого интерфейса документа (SDI) это CFrameWnd, которое служит главным окном приложения и единственным окном документа. Для множественного интерфейса документов (MDI) это MDI-Frame (класс CMDIFrameWnd), который служит как основное фреймовое окно приложения, содержащее все дочерние CFrameWnd. Каждое дочернее окно имеет класс CMDIChildWnd (производный от CFrameWnd) и служит одним из потенциально многих окон фреймов документов.

DocTemplates

CDocTemplate является создателем и управляющим документами. Он владеет документами, которые он создает. Если приложение использует описанный ниже подход на основе ресурсов, он не должен быть производным от CDocTemplate.

Для приложения SDI класс CSingleDocTemplate отслеживает один открытый документ. Для приложения MDI класс CMultiDocTemplate сохраняет список (a CPtrList) всех открытых в настоящее время документов, созданных из этого шаблона. CDocTemplate::AddDocument и CDocTemplate::RemoveDocument укажите функции виртуальных членов для добавления или удаления документа из шаблона. CDocTemplate — это друг CDocument, поэтому мы можем установить защищённый указатель возврата CDocument::m_pDocTemplate к шаблону, который создал документ.

CWinApp обрабатывает реализацию по умолчанию OnFileOpen , которая, в свою очередь, запрашивает все шаблоны документов. Реализация включает поиск уже открытых документов и определение формата, в котором будут открываться новые документы.

CDocTemplate управляет привязкой пользовательского интерфейса для документов и кадров.

CDocTemplate сохраняет количество неназванных документов.

CDocument

A CDocument принадлежит объекту CDocTemplate.

В документах есть список открытых представлений (производных от CView), которые просматривают документ (a CPtrList).

Документы не создают и не уничтожают представления, но они присоединяются друг к другу после их создания. При закрытии документа (т. е. через пункт меню Файл/Закрыть) все связанные с ним представления будут закрыты. После закрытия последнего вида документа (то есть с помощью команды «Окно/Закрыть») сам документ будет закрыт.

CDocument::AddView интерфейс RemoveView используется для поддержания списка представлений. CDocument является другом CView, так что мы можем установить обратный указатель CView::m_pDocument.

CFrameWnd

A CFrameWnd (также известный как кадр) играет ту же роль, что и в MFC 1.0, но теперь CFrameWnd класс предназначен для использования во многих случаях без получения нового класса. Производные классы CMDIFrameWnd и CMDIChildWnd также улучшены так много стандартных команд уже реализованы.

За создание окон в клиентской области кадра отвечает CFrameWnd. Обычно есть одно главное окно, заполняющее клиентскую область кадра.

Для окна MDI-Frame клиентская область заполняется элементом управления MDICLIENT, который, в свою очередь, является родительским элементом всех окон MDI-Child кадров. Для окна SDI-Frame или оконной рамки MDI-Child клиентская область обычно заполняется производным объектом окна CView. В случае CSplitterWnd, клиентская область представления заполняется CSplitterWnd объектом окна, а CView производные объекты окон (по одному на каждую панель) создаются как дочерние окна CSplitterWnd.

См. также

Технические примечания по номеру
Технические заметки по категориям