A>Объясните пожалуйста как можно свзязать
A>паттерн Модель — Представление — Контроллер в оконном приложении
Как это делал я. Идея такая.
Модель содержит коллекцию геометрий.
Вьюшка отображает модель и передаёт сообщения системы контроллерам.
Контроллеры делают основную работу по модификации данных модели и режимов отображения вьюшки.
Модель:
class CVisualizationDoc : public CDocument
{
public:
...
// Тут методы для доступа к данным и т.п.
...
};
Вьюшка:
class CVisualizationView : public CView
{
public:
...
virtual void OnDraw(CDC* pDC);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
...
private:
Controller* m_pActiveController;
};
// Выбираем текущий контроллер, кнопками на тулбаре
void CVisualizationView::OnController(UINT uID)
{
m_uCurrentControllerID = uID;
delete m_pActiveController;
switch(m_uCurrentControllerID)
{
// Меняем область отображения у вьюшки
case ID_CONTROLLER_ZOOM_IN:
m_pActiveController = new ZoomInController(this);
break;
case ID_CONTROLLER_ZOOM_OUT:
m_pActiveController = new ZoomOutController(this);
break;
// Редактируем существующие обьекты, модифицируем модель
case ID_CONTROLLER_EDIT:
m_pActiveController = new EditController(this);
break;
case ID_CONTROLLER_CREATE:
m_pActiveController = new CreatePolygonController(this);
break;
default:
m_pActiveController = NULL;
}
}
// Отрисовываем выбраный - нажатым
void CVisualizationView::OnUpdateController(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(pCmdUI->m_nID == m_uCurrentControllerID);
}
// Вьюшка получила сообщение от системы(пользователя) которое обрабатывает контроллер
void CVisualizationView::OnMouseMove(UINT nFlags, CPoint point)
{
if(m_pActiveController != NULL)
m_pActiveController->OnMouseMove(nFlags, point);
CView::OnMouseMove(nFlags, point);
}
...
Контроллер:
// Базовый контроллер, дочерние переопределяют необходимые им методы и т.д.
class Controller
{
public:
Controller(CVisualizationView* pView);
virtual ~Controller();
virtual void OnLButtonDown(UINT nFlags, CPoint point) {}
virtual void OnLButtonUp(UINT nFlags, CPoint point) {}
virtual void OnMouseMove(UINT nFlags, CPoint point) {}
virtual void OnDraw(CDC* pDC) {}
protected:
CVisualizationView* m_pView;
};
... << RSDN@Home 1.1.4 beta 5 rev. 395>>