|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Воспроизведение метафайла
Метод OnDraw() должен обновлять изображение программы painter, что в нашем случае сводится к обычному воспроизведению метафайла. Сначала необходимо закрыть его и получить логический номер метафайла, а затем воспроизвести по логическому номеру. В методе OnDraw() этот процесс будет выглядеть так:
void CPainterView::OnDraw(CDC* pDC) { CPainterDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); HMETAFILE MetaFileHandle = pDoc->pMetaFileDC->Close(); pDC->PlayMetaFile(MetaFileHandle); } Однако после закрытия метафайла мы уже сможем записывать в него. Означает ли это, что при следующем обновлении будет потеряно все, что было нарисовано после закрытия? Нет, можно создать новый метафайл и воспроизвести в нем старый (для которого у нас есть логический номер):
void CPainterView::OnDraw(CDC* pDC) { CPainterDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); HMETAFILE MetaFileHandle = pDoc->pMetaFileDC->Close(); pDC->PlayMetaFile(MetaFileHandle); CMetaFileDC* ReplacementMetaFile = new CMetaFileDC(); ReplacementMetaFile->Create(); ReplacementMetaFile->PlayMetaFile(MetaFileHandle); …………………………………………………….. }
После этого можно заменить старый метафайл новым и удалить старый метафайл:
void CPainterView::OnDraw(CDC* pDC) { CPainterDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); HMETAFILE MetaFileHandle = pDoc->pMetaFileDC->Close(); pDC->PlayMetaFile(MetaFileHandle); CMetaFileDC* ReplacementMetaFile = new CMetaFileDC(); ReplacementMetaFile->Create(); ReplacementMetaFile->PlayMetaFile(MetaFileHandle); DeleteMetaFile(MetaFileHandle); delete pDoc->pMetaFileDC; pDoc->pMetaFileDC = ReplacementMetaFile; } В результате мы воспроизвели графическое изображение в клиентской области, как и положено в методе OnDraw(), и создали новый метафайл для следующего обновления.
Такой подход устраняет старую проблему Visual С++ — восстановление окна программы в методе OnDraw(). В нашем случае удалось найти простое решение, основанное на работе с метафайлами. Теперь наше приложение при необходимости сможет обновить изображение в своем окне. Использование метафайлов сопряжено с одной проблемой — если вы вызываете графический метод, возвращающий информацию о контексте устройства (например, сведения о высоте или ширине), то воспроизведение метафайла в другом контексте может оказаться неудачным, поскольку размеры не обязательно останутся прежними. Если вы хотите вызывать методы, возвращающие информацию о контексте устройства, воспользуйтесь методом SetAttribDC() класса CMetaFileDC, чтобы связать метафайл с контекстом устройства того типа, в котором он должен воспроизводиться. В этом случае вызовы информационных методов будут переадресованы соответствующему контексту устройства, а возвращаемые значения станут осмысленными. Возможности метафайлов этим не ограничиваются — изображение, находящееся в метафайле, можно сохранить на диске.
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.003 сек.) |