АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Воспроизведение метафайла

Читайте также:
  1. Воспроизведение
  2. Воспроизведение действия

Метод 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, чтобы связать метафайл с контекстом устройства того типа, в котором он должен воспроизводиться. В этом случае вызовы информационных методов будут переадресованы соответствующему контексту устройства, а возвращаемые значения станут осмысленными.

Возможности метафайлов этим не ограничиваются — изображение, находящееся в метафайле, можно сохранить на диске.

 


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.003 сек.)