- •Практична робота № 5 Створення найпростішого графічного режактору.
- •Хід роботи:
- •1.1 Встановлення прапорців.
- •2.2 Створення меню і кнопок панелі інструментів.
- •2.3 Зв’язування прапорців з засобами користувацького інтерфейсу.
- •2.4 Помітка команд меню.
- •1.5 Обробка повідомлення про натиснення кнопки миші.
- •1.6 Малювання ліній.
- •1.7 Малювання прямокутників.
- •1.8 Малювання еліпсів.
- •1.9 Замальовування фігур.
- •Завдання на практичну роботу:
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);
}