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

    OldPoint.y=Anchor.y;

    // TODO: Add your message handler code here and/or call default

    CView::OnLButtonDown(nFlags, point);

}

          Предстоящую работу можно разделить на три этапа:

а) Стирание линии от начальной точки Anchor к предыдущей точке OldPoint          (там, где раньше заканчивалась линия).

 б) Рисование новой линии от Anchor к текущему положению указателя;

 в) Копирование координат текущей точки в OldPoint для следующего перемещения мыши.

          Все эти этапы будут реализованы в обработчике OnMouseMove().

          Чтобы стереть линию от Anchor до  OldPoint  необходимо выбрать в контексте устройства бинарный растровый режим R2_NOT и снова нарисовать ту же линию. Этот режим означает, что при рисовании каждого нового пикселя экранный пиксель инвертируется. Поскольку в программе линии имеют черный цвет, а фон- белый, то после повторной прорисовки в этом режиме линия станет белой, то есть фактически окажется стертой. Кроме того, если растягиваемая линия пройдет над черным участком, её соответствующий  отрезок станет белым, чтобы его было видно. Перед тем, как установить растровый режим R2_NOT, текущий режим запоминается в локальной переменной nOldMode.

          Аналогично выглядит код для растягивания прямоугольников и эллипсов. Теперь обработчик перемещения мыши имеет вид

void Cgraf_painterView::OnMouseMove(UINT nFlags, CPoint point)

{

    int nOldMode;//прежний растровый режим

    CClientDC*pDC=new CClientDC(this);

    if(nFlags && MK_LBUTTON && bDrawFlag)

    {

    pDC->MoveTo(Anchor.x,Anchor.y);

        pDC->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

    CView::OnMouseMove(nFlags, point);

}

14) Обеспечить обновление изображения.

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