Re: Модель представление контроллер
От: maxal  
Дата: 21.04.05 14:52
Оценка:
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>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.