Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
65-96.doc
Скачиваний:
5
Добавлен:
11.11.2019
Размер:
340.99 Кб
Скачать

Подведение итогов

  • Библиотека MFC предоставляет обработчик сообщений для команд New, Open..., Save, Save As... и списка последних открытых файлов меню File, в функции необходимо написать код поддержки.

  • MFC-обработчики команд Open... и Save As... для ввода имени файла и пути к нему отображают стандартные диалоговые окна Open... и Save As....

  • Перед инициализацией нового документа, открытием существующего или завершением работы программы MFC вызывает функцию DeleteContents() класса документа. Для удаления данных документа эту функцию необходимо переопределить.

  • Обработчики команд New, Open..., Save, Save As... и списка последних открытых файлов меню File открывают файл, а затем вызывают функцию Serialize() класса документа для чтения или записи данных. Функция Serialize() также вызывается библиотекой MFC при перетаскивании объекта файла в окно программы или открытии файла двойным щелчком.

  • Функция Serialize() позволяет читать или записывать переменные базовых типов, используя перегруженные операторы << и >> применительно к объектам класса CArchive.

  • Функция Serialize() читает или записывает данные объекта, вызывая его собственную функцию Serialize(). Если объект принадлежит к определенному классу, необходимо добавить функцию Serialize() в тот класс, который читает или записывает данные объекта.

  • При каждом изменении данных программы класс документа должен вызывать функцию SetModifiedFlag() класса CDocument. Вызов этой функции сообщает MFC, что документ изменился. Тогда MFC позволяет сохранить данные на диске перед их удалением из памяти

  • Программу можно изменить так, чтобы пользователь мог открыть файл, выполняя двойной щелчок на объекте файла со стандартным расширением (например, .drw) в папке Windows. Для этого поместите вызовы функций EnableShellOpen() и RegisterShellFileTypes() класса CWinApp внутри функции InitInstance().

Глава 4. Прокрутка и разделение окон представления

В этой главе рассматриваются вопросы:

  • создание средств прокрутки окна представления;

  • создание средств разделения окна представления;

  • обновление окна представления.

Процесс взаимодействия объектов документа и его представления

Взаимодействие объектов документа и представления осуществляется с помощью следующих функций: CDocument::UpdateAllViews(), CDocument::OnNewDocument(), CView::GetDocument(), CView::OnUpdate(), CView::OnInitialUpdate().

С объектом представления связан один объект документа. Однако этот документ может быть представлен в нескольких видах. Чтобы выяснить, какому документу соответствует данное окно представления, необходимо получит указатель на объект документа. Функция CView::GetDocument() возвращает указатель на документ, через этот указатель можно обращаться к функциям-членам или открытым переменным-членам класса документа. Если возвращается указатель со значением NULL, значит, представление не связано с документом и обратиться к методам класса документа невозможно. Прототип рассматриваемой функции такой:

CDocument* GetDocument( );

Функция CDocument::OnNewDocument() вызывается после создания объекта документа при выборе команды File New. Именно в этой функции инициализуются переменные-члены класса документа. В нашем приложении вы не будете переопределять эту функцию.

Функция CDocument::UpdateAllViews() вызывается в случае, если изменился документ и об этом надо уведомить все объекты представления, чтобы те обновили представления своих данных. Если функция UpdateAllViews() вызывается из функции-члена класса документа, то ее аргумент имеет значение 0 (NULL). Если эта функция вызывается из функции-члена класса представления, то ее аргумент должен иметь значение this, которое указывает на текущий объект представления. Если необходимо передать объекту представления специфическую для приложения информацию о том, какие части представления следует

обновить, то используются необязательные параметры функции. Функция UpdateAllViews() класса CDocument имеет следующий прототип.

void CDocument::UpdateAllViews ( CView* pSender, LPARAM lHint = 0L, CObject* pHint = NULL );

Параметр pSender определяет указатель на представление, которое изменило документ, параметр lHint содержит информацию о выполненных модификациях, параметр pHint является указателем на объект, сохраняющим изменения, которые нужно внести в документ.

Функция CView::OnUpdate() вызывается в ответ на вызов приложением функции CDocument::UpdateAllViews(). Эта функция обращается к документу и, получив его данные, обновляет переменные-члены класса представления или объявляет часть представления недействительной, что заставляет функцию CView::OnDraw() перерисовать часть окна по данным документа. Непереопределенная версия функции CView::OnUpdate() объявляет недействительным все окно представления. Для повышения эффективности перерисовки окна представления пользователь должен переопределить функцию CView::OnUpdate() и объявить недействительным прямоугольник в соответствии с информацией, полученной от функции CDocument::UpdateAllViews(). Если эта функция вызывается с параметром, указывающим на конкретный объект представления, то CView::OnUpdate() вызывается для всех представлений документа, кроме заданного в параметре. Прототипы функций такиев:

virtual void OnUpdate( CView* pSender, LPARAM lHint, CObject* pHint );

Назначение параметров аналогично предыдущей функции.

virtual void OnDraw( CDC* pDC );

Параметр pDC — это указатель на контекст устройства, который используется для представления документа.

Функция CView::OnInitialUpdate() вызывается при запуске приложения и при выборе команды FileNew и FileOpen. Она выполняет инициализацию объекта представления. Если функция переопределена в производном классе представления, то она вызывает функцию OnUpdate() производного класса или OnInitialUpdate() базового класса.

Приложение вызывает функцию CMPaintView::OnInitial-Update() после того, как полностью создано окно представления, перед выполнением рисования с помощью функции CMуPaintView::OnDraw(). Это первая функция, к которой обращается приложения. Прототип функции следующий.

virtual void OnInitialUpdate( );

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]