Чтение онлайн

на главную - закладки

Жанры

Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT. Часть 2

Фролов Григорий Вячеславович

Шрифт:

//////////////////////////////////////////////////////////////

// CMultiView drawing

void CMultiView::OnDraw(CDC* pDC) {

 CMultiDoc* pDoc = GetDocument;

 ASSERT_VALID(pDoc);

 int i;

 for (i=0; i<pDoc->pointFigCenter.GetSize; i++)

pDC->Rectangle(pDoc->pointFigCenter[i].x-10, pDoc->pointFigCenter[i].y-10, pDoc->pointFigCenter[i].x+10, pDoc->pointFigCenter[i].y+10);

}

Переопределите метод DeleteContents класса CMultiDoc так, чтобы он удалял содержимое документа. Для этого достаточно удалить все элементы массива pointFigCenter, воспользовавшись методом RemoveAll класса CArray. После очистки документа необходимо вызвать метод DeleteContents базового класса CDocument .

Чтобы вставить в класс CMultiDoc метод DeleteContents используйте MFC ClassWizard, а затем модифицируйте его в соответствии со следующим фрагментом кода:

//////////////////////////////////////////////////////////////

// CMultiDoc commands

void CMultiDoc::DeleteContents {

 // Очищаем документ, удаляя все элементы массива arrayFig.

 pointFigCenter.RemoveAll;

 // Вызываем метод DeleteContents базового класса CDocument

 CDocument::DeleteContents;

}

Теперь, когда документ создан и приложение умеет отображать его на экране, остается доработать приложение, чтобы оно могло сохранять документ в файле на диске и загружать уже существующие документы из файлов. Для этого переопределите метод Serialize класса документа. Шаблон для этого метода уже определен в приложении:

//////////////////////////////////////////////////////////////

// CMultiDoc serialization

void CMultiDoc::Serialize(CArchive& ar) {

 pointFigCenter.Serialize(ar);

}

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

Синхронизация окон просмотра документа

Как правило, многооконные приложения позволяют открыть для одного документа несколько окон просмотра. Наше приложение тоже не составляет исключения. Чтобы открыть дополнительное окно для просмотра уже открытого документа, выберите из меню Window строку New.

Откроется новое окно. Заголовки окон просмотра одного документа будут одинаковыми за исключением того, что каждое такое окно имеет дополнительный числовой идентификатор, означающий номер окна. На рисунке 1.14 мы показали как будет выглядеть приложение Multi, если в нем создать два новых документа Multi1 и Multi2, а затем открыть два дополнительных окна для просмотра документа Multi2.

Рис. 1.14. Окно Project Workspace, класс CMultiView

К сожалению, окна просмотра документа несогласованны. Если вы внесете в документ изменения через одно окно, они не появятся во втором до тех пор, пока содержимое окна не будет перерисовано. Чтобы избежать рассогласования между окнами просмотра одного и того же документа, необходимо сразу после изменения документа в одном окне вызвать метод UpdateAllViews, определенный в классе CDocument:

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

Метод UpdateAllViews вызывает метод CView::OnUpdate для всех окон просмотра данного документа, за исключением окна просмотра, указанного параметром pSender. Как правило, в качестве pSender используют указатель того окна просмотра через который был изменен документ. Его состояние изменять не надо, так как оно отображает последние изменения в документе.

Если изменение документа вызвано другими причинами, не связанными с окнами просмотра, в качестве параметра pSender можно указать значение NULL. В этом случае будут вызваны методы OnUpdate всех окон просмотра без исключения.

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

Мы изменяем документ только в методе OnLButtonDown. Поэтому добавьте вызов UpdateAllViews в нем. Разместите его после добавления нового элемента в массив pointFigCenter и установки флага модификации документа (метод UpdateAllViews следует вызывать после метода SetModifiedFlag):

void CMultiView::OnLButtonDown(UINT nFlags, CPoint point) {

 // …

 // Устанавливаем флаг изменения документа

 pDoc->SetModifiedFlag;

 // Сообщаем всем окнам просмотра кроме данного об

 // изменении документа

 pDoc->UpdateAllViews(this);

 // Вызываем метод OnLButtonDown базового класса CView

 CView::OnLButtonDown(nFlags, point);

}

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

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

Выход из этого положения существует. При вызове метода UpdateAllViews можно указать, какой объект надо дорисовать. А потом надо переопределить метод OnUpdate так, чтобы приложение дорисовывало в окнах просмотра одну только новую фигуру. Для передачи информации от метода UpdateAllViews методу OnUpdate используют параметры lHint и pHint.

Поделиться:
Популярные книги

Королева Жанна. Книги 1-3

Олов Нид
Любовные романы:
исторические любовные романы
5.00
рейтинг книги
Королева Жанна. Книги 1-3

Портрет дьявола: Собрание мистических рассказов

Скотт Вальтер
Проза:
классическая проза
8.09
рейтинг книги
Портрет дьявола: Собрание мистических рассказов

На границе империй. Том 9. Часть 2

INDIGO
15. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 2

Базис

Владимиров Денис
7. Глэрд
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Базис

Путь Князя. Эллирия в огне

Рокотов Алексей
8. Путь князя
Фантастика:
фэнтези
рпг
попаданцы
5.00
рейтинг книги
Путь Князя. Эллирия в огне

Князь Андер Арес 5

Грехов Тимофей
5. Андер Арес
Фантастика:
историческое фэнтези
фэнтези
героическая фантастика
5.00
рейтинг книги
Князь Андер Арес 5

Тринадцатый VIII

NikL
8. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый VIII

Бастард Императора. Том 7

Орлов Андрей Юрьевич
7. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 7

Геном хищника. Книга седьмая

Гарцевич Евгений Александрович
7. Я - Легенда!
Фантастика:
боевая фантастика
рпг
фэнтези
попаданцы
5.00
рейтинг книги
Геном хищника. Книга седьмая

Кодекс Охотника. Книга XIX

Винокуров Юрий
19. Кодекс Охотника
Фантастика:
фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга XIX

Око василиска

Кас Маркус
2. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Око василиска

Здравствуй, 1985-й

Иванов Дмитрий
2. Девяностые
Фантастика:
альтернативная история
5.25
рейтинг книги
Здравствуй, 1985-й

Тринадцатый IV

NikL
4. Видящий смерть
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Тринадцатый IV

Я снова не бог. Книга XXXVIII

Дрейк Сириус
38. Дорогой барон!
Фантастика:
аниме
попаданцы
5.00
рейтинг книги
Я снова не бог. Книга XXXVIII