- •Практична робота № 5 Створення найпростішого графічного режактору.
- •Хід роботи:
- •1.1 Встановлення прапорців.
- •2.2 Створення меню і кнопок панелі інструментів.
- •2.3 Зв’язування прапорців з засобами користувацького інтерфейсу.
- •2.4 Помітка команд меню.
- •1.5 Обробка повідомлення про натиснення кнопки миші.
- •1.6 Малювання ліній.
- •1.7 Малювання прямокутників.
- •1.8 Малювання еліпсів.
- •1.9 Замальовування фігур.
- •Завдання на практичну роботу:
2.4 Помітка команд меню.
За допомогою ClassWizard зв’яжіть з кожною командою меню метод оновлення, а в ньому необхідно помітити команду меню в залежності від значення прапорця.
void CPainterView::OnUpdateToolsEllipse(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(bEllipseFlag);
}
void CPainterView::OnUpdateToolsFillfigure(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(bFillFlag);
}
void CPainterView::OnUpdateToolsLine(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(bLineFlag);
}
void CPainterView::OnUpdateToolsRectangle(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(bRectangleFlag);
}
1.5 Обробка повідомлення про натиснення кнопки миші.
Якщо користувач натискає кнопку миші в клієнтській області програми, це значить, що він збирається малювати, а отже необхідно запам’ятати початкову точку. Для цього за допомогою ClassWizard необхідно додати метод:
void CPainterView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
Anchor.x=point.x;
Anchor.x=point.y;
CView::OnLButtonDown(nFlags, point);
}
1.6 Малювання ліній.
Лінія малюється при відпускані кнопки миші тому додайте в програму метод:
void CPainterView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CView::OnLButtonUp(nFlags, point);
}
При відпусканні кнопки миші користувач задає положення кінцевої точки. ЇЇ необхідно запам’ятати:
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;
CView::OnLButtonUp(nFlags, point);
}
У звичайній програмі ми б занесли необхідну інформацію у спеціальні змінні і потім викликали б Invalidate(), щоб все малювання відбувалось в методі OnDraw(). Але в нашому випадку це не бажано. До поточної лінії користувач міг намалювати багато фігур, так що програмі прийшлось би запам’ятовувати все, що було до цього часу і відтворювати зображення в методі OnDraw() при додавання нових фігур.
Ми будемо оновлювати вміст вікна за допомогою мета файлів. Для цієї мети використовується клас 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);
CView::OnLButtonUp(nFlags, point);
}
Тепер можна малювати. Впевнимося, що необхідно малювати лінію:
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)
{
}
CView::OnLButtonUp(nFlags, point);
}
Для малювання спочатку перемістимося у початкову точку за допомогою методу MoveTo(), а потівм намалюємо лінію до кінцевої точки методом LineTo();
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);
}
CView::OnLButtonUp(nFlags, point);
}