Естественно, что при растягивании фигур необходимости в дублировании нет.
void Cgraf_painterView::OnMouseMove(UINT nFlags, CPoint point)
{
Cgraf_painterDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
int nOldMode;//прежний растровый режим
CClientDC*pDC=new CClientDC(this);
if(nFlags && MK_LBUTTON && bDrawFlag)
{
pDC->MoveTo(Anchor.x,Anchor.y);
pDC->LineTo(point.x,point.y);
pDoc->pMetaFileDC->MoveTo(Anchor.x,Anchor.y);
pDoc->pMetaFileDC->LineTo(point.x,point.y);
Anchor.x=point.x;
Anchor.y=point.y;
}
if(nFlags && MK_LBUTTON && bLineFlag)
{
nOldMode=pDC->GetROP2();//запомнили текущий растровый режим
pDC->SetROP2(R2_NOT);//установка нового режима-цвет пикселя является инвертированным цветом экрана
pDC->MoveTo(Anchor.x,Anchor.y);
pDC->LineTo(OldPoint.x,OldPoint.y);//произошло стирание
pDC->MoveTo(Anchor.x,Anchor.y);
pDC->LineTo(point.x,point.y);//провели линию в текущую точку
OldPoint.x=point.x;
OldPoint.y=point.y;//обновили OldPoint
pDC->SetROP2(nOldMode);//восстановили прежний режим
}
if(nFlags && MK_LBUTTON && bRectangleFlag)
{
CClientDC*pDC=new CClientDC(this);
nOldMode=pDC->GetROP2();//запомнили текущий растровый режим
pDC->SetROP2(R2_NOT);//установка нового режима-цвет пикселя является инвертированным цветом экрана
pDC->SelectStockObject(NULL_BRUSH);
pDC->Rectangle(OldPoint.x,OldPoint.y,Anchor.x,Anchor.y);//произошло стирание
pDC->Rectangle(Anchor.x,Anchor.y,point.x,point.y);
OldPoint.x=point.x;
OldPoint.y=point.y;//обновили OldPoint
pDC->SetROP2(nOldMode);//восстановили прежний режим
}
if(nFlags && MK_LBUTTON && bEllipseFlag)
{
CClientDC*pDC=new CClientDC(this);
nOldMode=pDC->GetROP2();//запомнили текущий растровый режим
pDC->SetROP2(R2_NOT);//установка нового режима-цвет пикселя является инвертированным цветом экрана
pDC->SelectStockObject(NULL_BRUSH);
pDC->Ellipse(OldPoint.x,OldPoint.y,Anchor.x,Anchor.y);//произошло стирание
pDC->Ellipse(Anchor.x,Anchor.y,point.x,point.y);
OldPoint.x=point.x;
OldPoint.y=point.y;//обновили OldPoint
pDC->SetROP2(nOldMode);//восстановили прежний режим
}
delete pDC;
// TODO: Add your message handler code here and/or call default
Итак, в метафайле находится полная запись изображения и его можно использовать для обновления изображения на экране.
г) Запрограммировать в функции OnDraw()обновление изображения.
Фактически задача сводится к воспроизведению метафайла.
void Cgraf_painterView::OnDraw(CDC* pDC/*pDC*/)
{
Cgraf_painterDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
HMETAFILE Nomer=pDoc->pMetaFileDC->Close();//Закрыли и узнали номер метафайла.Теперь в него писать нельзя.
pDoc->pMetaFileDC->PlayMetaFile(Nomer);//воспроизвели его по номеру
//Создаем указатель на новый метафайл и выделяем ему память
CMetaFileDC*New_metafile=new CMetaFileDC();
//Создаем новый метафайл
New_metafile->Create();
New_metafile->PlayMetaFile(Nomer);//воспроизводим его по известному номеру
// Теперь старый метафайл можно заменить новым,а старый удалить
DeleteMetaFile(Nomer);
delete pDoc->pMetaFileDC;
pDoc->pMetaFileDC=New_metafile;
// TODO: add draw code for native data here
}
Сначала необходимо закрыть метафайл, чтобы узнать его логический номер. Он будет использоваться в дальнейшем. Затем воспроизвести метафайл по полученному номеру, т.к. в нем содержится требуемое изображение. После закрытия метафайла мы уже не сможем записывать в него.Чтобы при следующем обновлении не потерять все, что было нарисовано после закрытия, надо создать новый метафайл и записать в него старый(для него уже есть номер).
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.