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

}

10)Запрограммировать рисование фигур.

          Рисование фигур происходит при отпускании левой кнопки мыши.

Добавить обработчик ОnLButtonUp(). Это делается как и в предыдущем случае.                                                                                                                                       

void Cgraf_painterView::OnLButtonUp(UINT n Flags,CPoint point)

{

 Cgraf_painterDoc*pDoc=GetDocument();

ASSERT_VALID(pDoc);

DrawTo.x=point.x;                                       //Задали конечную

DrawTo.y=point.y;                                       //точку.

CClientDC*pDC=new CClientDC(this);      //создается контекст устройства для //вида в произвольный момент. Это можно делать не только в методе. //OnDraw( ).  Класс CClientDC является производным от класса CDC. //Достаточно ему передать указатель this на текущий объект, чтобы создать //контекст устройства. В нем мы можем рисовать точно так же,  как в

 //методе OnDraw( ).

  if ( bLineFlag)

            {

pDC→Move TO(Anchor.x, Anchor.y);  // Курсор в начальной точке.

pDC→LineTo(DrawTo.x, DrawTo.y);

             }

 if( bRectanglFlag)

             {

pDC→MoveTo  (Anchor.x, Anchor.y) ;

pDC→Rectangle  ( Archor.x, Archor.y, DrawTo.x, DrawTo.y ) ;

             }

 if  ( bEllipseFlag)

             {

pDC→MoveTo  (Anchor.x, Anchor.y) ;

pDC→Ellipse  ( Archor.x, Archor.y, DrawTo.x, DrawTo.y ) ;

}

//  Закраска фигур. Используется  FloodFill( ) и черная кисть

if ( bFillFlag)

          {

pDC→SelectStockObject( BLACK_BRUSH); //чёрная кисть

pDC→FloodFill (Anchor.x, Anchor.y, RGB(0,0,0));

             }

delete pDC; //удаляем указатель на текущий вид

CView::OnLButtonUp(nFlags, point);// обработчик //базового класса

}

11) Запрограммировать рисование фигуры произвольной формы.

При нажатии левой кнопки мыши запомнить начальную точку. Когда мышь перемещается в новую точку будет рисоваться линия от начальной точки в текущую. Затем текущая точка делается начальной для следующего перемещения мыши. Таким образом, обработчик перемещения мыши вначале имеет вид

void Cgraf_painterView::OnMouseMove(UINT nFlags,

CPoint point)

{

    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;

    }

    delete pDC;

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

    CView::OnMouseMove(nFlags, point);

}

Следует обратить внимание, что рисование возможно при одновременном выполнении условий, указанных в  if().

12) Измененить указатель мыши.

Для удобства рисования фигур произвольной формы создадим новый указатель в виде крестика. Для этого изменим содержимое информационной структуры (CREATESTRUCT &cs)окна  в методе PreCreateWindow(CREATESTRUCT& cs), присутствующем в классе вида.Зададим в ней новый указатель в виде крестика, IDC_CROSS.

.

BOOL  Cgraf_painterView PreCreateWindow(CREATESTRUCT & cs)

    {

cs.lpszClass=AfxRegisterWndClass(CS_DBLCLKS,AfxGetApp( )→LoadStandardCursor          ( IDC_CROSS),(HBRUSH)(COLOR_WINDOW+1),AfxGetApp( ) →LoadIcon(IDC_MAINFRAME));

return CView::PreCreateWindow(cs);

      }

Новый указатель в виде крестика (IDC_CROSS).эта функция уже есть, но “пустая”.

13) Обеспечить растягивание графических фигур.

Код для имитации растягивания фигур включен в OnMouseMove().

           Начнем с растягивания линий. Чтобы провести линию от начальной точки до текущей, следует сначала стереть старое изображение линии от начальной точки к предыдущей и нарисовать новую- от начальной до текущей точки. Но прежде, чем стирать, нужно запомнить положение стираемой линии. Для этого добавим в программу объект класса CPoint с именем OldPoint. В нем  будет сохраняться положение указателя мыши при вызовах OnMouseMove(). При нажатии кнопки мыши необходимо занести в OldPoint  текущие координаты. Теперь обработчик нажатия мыши имеет вид:

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

{

    Anchor.x=point.x;

    Anchor.y=point.y;

    OldPoint.x=Anchor.x;