Здорова друзья! Сегодня разберем такую штуку как множественное обновление видов. В MFC когда мы создаем MDI приложение то у нас появляется меню по умолчанию Окно
и когда вы выбираете пункт Новое окно, то у вас создается новое представление, не путайте, это не новый документ создается, а именно новое представление и при перерисовке окна нам нужно обновлять как раз именно все представления а не одно какое нить, для того что бы обновить все представления и существует функция класса документа UpdateAllViews. От мы ее в этом посте рассмотрим и рассмотрим небольшой примерчик на эту функцию.
И так прототип этой функции
1 2 3 4 5 |
void UpdateAllViews( CView* pSender//Указатель на представление которое изменило документ или NULL если все просмотры должны модифицироваться ,LPARAM lHint = 0L//Содержит информацию относительно модификации ,CObject* pHint = NULL//Указатель на объект содержащий информациию относительно модификации ); |
- В общем первый параметр pSender это указатель на представление которое изменило документ, мы если передаем NULL, то меняются все представления
- Второй параметр lHint он содержит информацию относительно модификации, я этот параметр не знаю что он делает, поэтому его опустим пока
- Третий параметр pHint содержит указатель на объект, ну например в примере который мы будем рассматривать ниже мы в этом указателе будем передавать объект типа CObject и уже в событии OnUpdate будем извлекать этот объект и обновлять определенные области во всех видах
Пример использования функции UpdateAllViews
И так ребятки создаем приложение MFC с типом MDI
выставляйте такие настройки как на рисунке выше и нажимайте кнопку Готово и у вас должна появится такая программа как на рисунке ниже
добавим в класс документа две переменные типа CPoint p1 и CPoint p2 в них будет хранится точки которые будут запоминаться при нажатии на правую и левую клавиши соответственно.
Давайте создадим обработчики событий WM_LBUTTONDOWN и WM_RBUTTONDOWN , и определим их функции
1 2 3 4 5 |
void Cmdi1View::OnLButtonDown(UINT nFlags, CPoint point) { Cmdi1Doc* pDoc=GetDocument(); pDoc->p1=point; } |
в обработчике OnLButtonDown мы получаем указатель на объект документа и сохраняем точку в которой находился курсор во время нажатия.
1 2 3 4 5 6 7 |
void Cmdi1View::OnRButtonDown(UINT nFlags, CPoint point) { Cmdi1Doc* pDoc=GetDocument(); pDoc->p2=point; //делаем недействительной всю область представления InvalidateRect(nullptr); } |
а в обработчике OnRButtonDown мы так же получаем указатель на объект документа, сохраняем точку в переменной p2 класса документа и объявляем всю область недействительно функцией InvalidateRect которой передаем в качестве параметра nullptr и все у нас обязательно должно заново вызваться функция Draw класса вида и у нас обновится вид, но увы не все виды обновятся, получается вид обновляет документ, а документ не обновляет остальные другие виды, а только этот вид.
На рисунке више я открыл два вида один и второй, в первом виде мы рисуем линию и видим что эта линия не появляется во втором виде. Рисуем просто кликаем раз левой клавишей мышки — запоминается точка в документе, затем кликаем правой клавишей мышки — запоминается другая точка в документе, делается вся область недействительной и перерисовывается вид, но увы только вид в котором были изменения. Как же сделать чтобы все остальные другие виды так же изменили — обновились? От как раз для этого и существует функция UpdateAllViews мы в изменим обработчик нажатия правой клавиши мышки на следующий
1 2 3 4 5 6 7 8 |
void Cmdi1View::OnRButtonDown(UINT nFlags, CPoint point) { Cmdi1Doc* pDoc=GetDocument(); pDoc->p2=point; //делаем недействительной всю область представления //InvalidateRect(nullptr); pDoc->UpdateAllViews(nullptr);//обновляем все виды } |
теперь зайдем в свойства класса вида, нажмем на кнопочку переопределение и выбираем функцию OnUpdate
все у вас в классе вида появится пустая функция OnUpdate, добавим в нее строчку кода
1 2 3 4 |
void Cmdi1View::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) { InvalidateRect(nullptr);//делаем недействительной всю область } |
Все теперь когда вы рисуете в одном из видом, то у вас будут изменятся все виды
на рисунке выше я рисовал в первом виде и у меня так же менялся и второй вид, там появлялась такая же линия, в общем функция работает.
Это примитивный пример, но все же он отчетливо показывает как нужно работать с этой функцией 🙂 .
[youtube]https://www.youtube.com/watch?v=DwOx-50534Y[/youtube]