Kselax.ru

Hacker Kselax — the best hacker in the world

Menu
  • Блог
  • Контакты
  • wp plugin генератор
  • Русский
    • Русский
    • English
Menu

MFC — множественное обновление видов представления

Posted on 9 ноября, 20149 ноября, 2014 by admin

Здорова друзья! Сегодня разберем такую штуку как множественное обновление видов. В MFC когда мы создаем MDI приложение то у нас появляется меню по умолчанию Окно

mfc new window

и когда вы выбираете пункт Новое окно, то у вас создается новое представление, не путайте, это не новый документ создается, а именно новое представление и при перерисовке окна нам нужно обновлять как раз именно все представления а не одно какое нить, для того что бы обновить все представления и существует функция класса документа 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

MFC type applicationвыставляйте такие настройки как на рисунке выше и нажимайте кнопку Готово и у вас должна появится такая программа как на рисунке ниже

mfc appдобавим в класс документа две переменные типа 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 класса вида и у нас обновится вид, но увы не все виды обновятся, получается вид обновляет документ, а документ не обновляет остальные другие виды, а только этот вид.

MFC app two viewНа рисунке више я открыл два вида один и второй, в первом виде мы рисуем линию и видим что эта линия не появляется во втором виде. Рисуем просто кликаем раз левой клавишей мышки — запоминается точка в документе, затем кликаем правой клавишей мышки — запоминается другая точка в документе, делается вся область недействительной и перерисовывается вид, но увы только вид в котором были изменения. Как же сделать чтобы все остальные другие виды так же изменили — обновились? От как раз для этого и существует функция 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

MFC onUpdateвсе у вас в классе вида появится пустая функция OnUpdate, добавим в нее строчку кода

1
2
3
4
void Cmdi1View::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
InvalidateRect(nullptr);//делаем недействительной всю область
}

Все теперь когда вы рисуете в одном из видом, то у вас будут изменятся все виды

MFC app UpdateAllViewsна рисунке выше я рисовал в первом виде и у меня так же менялся и второй вид, там появлялась такая же линия, в общем функция работает.

Это примитивный пример, но все же он отчетливо показывает как нужно работать с этой функцией 🙂 .

[youtube]https://www.youtube.com/watch?v=DwOx-50534Y[/youtube]

Добавить комментарий Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Рубрики

  • C++ (293)
  • JavaScript (1)
  • linux (1)
  • MFC (39)
  • node.js (2)
  • React (3)
  • vBulletin (5)
  • Visual Studio (9)
  • wordpress (18)
  • Разное (29)

Метки

Ajax bootstrap CentOS CLI expressjs FormData GDlib google Invisible reCAPTCHA JWT media MFC php react-router-dom redux repository wordpress RTTI STL vBulletin vector Visual Studio WINAPI wordpress wp-plugins XMLHttpRequest Двоичное дерево Задачи С++ Игры С++ Исключения С++ О-большое Операторы_С++ Перегрузка операторов С++ Поиск С++ Потоки Проектирование_С++ С++ Типы_С++ Типы С++ Шаблоны С++ библиотеки локализация макросы С++ сортировка С++

Свежие комментарии

  • RA3PKJ к записи visual C++, создание диалоговых окон.
  • JasonReant к записи Создание и использование статических библиотек .lib в visual studio.
  • MyWin2020 к записи Программка для заполнения форума на vBulletin 3.8.7
  • ScottJip к записи Создание и использование статических библиотек .lib в visual studio.
  • ArnoldKig к записи Создание и использование статических библиотек .lib в visual studio.
©2021 Kselax.ru Theme by ThemeGiant