Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практична робота № 5.doc
Скачиваний:
31
Добавлен:
19.12.2018
Размер:
67.07 Кб
Скачать

1.7 Малювання прямокутників.

Спершу впевнимося, що необхідно малювати прямокутник.

void CPainterView::OnLButtonUp(UINT nFlags, CPoint point)

{

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

DrawTo.x=point.x;

DrawTo.y=point.y;

CClientDC* pDC=new CClientDC(this);

if(bLineFlag)

{

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

pDC->LineTo(DrawTo.x,DrawTo.y);

}

if(bRectangleFlag)

{

}

CView::OnLButtonUp(nFlags, point);

}

Для малювання прямокутника використовується метод Rectangle() класу CClientDC. Йому передаються координати двох точок початкової і кінцевої, що визначають положення фігури.

void CPainterView::OnLButtonUp(UINT nFlags, CPoint point)

{

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

DrawTo.x=point.x;

DrawTo.y=point.y;

CClientDC* pDC=new CClientDC(this);

if(bLineFlag)

{

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

pDC->LineTo(DrawTo.x,DrawTo.y);

}

if(bRectangleFlag)

{

pDC->Rectangle(Anchor.x, Anchor.y,DrawTo.x,DrawTo.y);

}

CView::OnLButtonUp(nFlags, point);

}

Але на цьому малювання прямокутника не закінчується – на екрані прямокутник буде заповнений поточним кольором фону. Все буде нормально доки він знаходиться в стороні від інших фігур, але при накладанні він витре все, що опиниться всередині нього.

Щоб уникнути псування зображення на екрані необхідно обрати в поточному контексті пристрою пустий пензлик методом SelectStockObject() класу CClientDC. Внутрішня область прямокутника замальовується пензлем і якщо той буде пустий, то внутрішння область залишиться без змін:

void CPainterView::OnLButtonUp(UINT nFlags, CPoint point)

{

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

DrawTo.x=point.x;

DrawTo.y=point.y;

CClientDC* pDC=new CClientDC(this);

if(bLineFlag)

{

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

pDC->LineTo(DrawTo.x,DrawTo.y);

}

if(bRectangleFlag)

{

pDC->SelectStockObject(NULL_BRUSH);

pDC->Rectangle(Anchor.x, Anchor.y,DrawTo.x,DrawTo.y);

}

CView::OnLButtonUp(nFlags, point);

}

1.8 Малювання еліпсів.

Еліпс малюється таким же чином як і прямокутник за виключення методу, що використовується для малювання еліпсів.

void CPainterView::OnLButtonUp(UINT nFlags, CPoint point)

{

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

DrawTo.x=point.x;

DrawTo.y=point.y;

CClientDC* pDC=new CClientDC(this);

if(bLineFlag)

{

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

pDC->LineTo(DrawTo.x,DrawTo.y);

}

if(bRectangleFlag)

{

pDC->SelectStockObject(NULL_BRUSH);

pDC->Rectangle(Anchor.x, Anchor.y,DrawTo.x,DrawTo.y);

}

if(bEllipseFlag)

{

pDC->SelectStockObject(NULL_BRUSH);

pDC->Ellipse(Anchor.x, Anchor.y,DrawTo.x,DrawTo.y);

}

CView::OnLButtonUp(nFlags, point);

}

1.9 Замальовування фігур.

Поки що всі намальовані фігури були «пустими» і складалися лише з контурів. Використовуючи метод FloodFill() можна обрати точку в контексті пристрою і задати колір межі. Потім цей метод замальовує фігуру поточним пензлем.

На прикладі використаємо пензель BLACK_BRUSH для заповнення методом FloodFill() в якій знаходиться початкова точка. Це робиться так:

void CPainterView::OnLButtonUp(UINT nFlags, CPoint point)

{

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

DrawTo.x=point.x;

DrawTo.y=point.y;

CClientDC* pDC=new CClientDC(this);

if(bLineFlag)

{

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

pDC->LineTo(DrawTo.x,DrawTo.y);

}

if(bRectangleFlag)

{

pDC->SelectStockObject(NULL_BRUSH);

pDC->Rectangle(Anchor.x, Anchor.y,DrawTo.x,DrawTo.y);

}

if(bEllipseFlag)

{

pDC->SelectStockObject(NULL_BRUSH);

pDC->Ellipse(Anchor.x, Anchor.y,DrawTo.x,DrawTo.y);

}

if(bFillFlag)

{

pDC->SelectStockObject(BLACK_BRUSH);

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

}

CView::OnLButtonUp(nFlags, point);

}