Создание простейшего графического редактора (Лабораторная работа № 20 по VisualC++ 2005), страница 5

          Естественно, что  при растягивании фигур  необходимости  в дублировании нет.

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

}

Сначала необходимо закрыть метафайл, чтобы узнать его логический номер. Он будет использоваться в дальнейшем. Затем воспроизвести метафайл по полученному номеру, т.к. в нем содержится требуемое изображение. После закрытия метафайла мы уже не сможем записывать в него.Чтобы при следующем обновлении не потерять все, что было нарисовано после закрытия, надо создать новый метафайл и записать в него старый(для него уже есть номер).