Читаем Программирование на Visual C++. Архив рассылки полностью

A1 В начале немного теории.

В технологии Документ/Представление у документа (class CDocument) может быть несколько представлений (class CView и его наследники), которые в свою очередь находяться (отображаются) во Фреймах (CFrameWnd). Представление может отображаться только в одном Фрейме, но во Фрейме могут отображаться несколько представлений.

Как я понял вопрос был по поводу динамического переключения Представлений (т.е. класса CView и/или любого его наследника, которым и является класс CFormView) внутри одного Фрейма. Библиотека MFC прямого решения не предоставлет, но тем не менее такая возможность есть. MFC каждому представлению присваивает идентификатор от AFX_IDW_PANE_FIRST до AFX_IDW_PANE_LAST (всего 256 вчем легко убедиться посмотрев их значения) но на экран отображается только Представление с ID=AFX_IDW_PANE_FIRST. Поэтому задача сводиться к корретному изменению ID.

Теперь практика. Пусть имеется готовое SDI приложение (с технологией Документ/Представление). Создаем дополнительное Представление. Это делается в функции CFrameWnd::OnCreateClient примерно так:

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) {

 // class CNewView – это наше новое представление

 pContext->m_pNewViewClass = RUNTIME_CLASS(CNewView);

 // обратите внимание на идентификатор нового Представления

 // переменная m_pNewView описана в CMainFrame как CNewView* m_pNewView;

 m_pNewView = STATIC_DOWNCAST(CNewView, CreateView(pContext, AFX_IDW_PANE_FIRST+1));

 m_pNewView->ShowWindow(SW_HIDE); // для сброса флага WS_VISIBLE

 return CFrameWnd::OnCreateClient(lpcs, pContext);

}

Теперь нам нужна функция переключения активного Представления на Представление только что нами созданное.

void CMainFrame::SwitchView(CView *pView) {

 CFormView *pNewView=STATIC_DOWNCAST(CFormView, pView),

 *pActiveView=STATIC_DOWNCAST(CFormView, GetActiveView);

 if (pNewView!=NULL && pActiveView!=NULL) {

  UINT tempID=::GetWindowLong(pActiveView->GetSafeHwnd, GWL_ID);

  ::SetWindowLong(pActiveView->GetSafeHwnd, GWL_ID, ::GetWindowLong(pNewView->GetSafeHwnd, GWL_ID));

  ::SetWindowLong(pNewView->GetSafeHwnd, GWL_ID, tempID);

  pActiveView->ShowWindow(SW_HIDE);

  pNewView->ShowWindow(SW_SHOW);

  pNewView->OnInitialUpdate;

  SetActiveView(pNewView);

  RecalcLayout; // можно делать можно и не делать

  pNewView->Invalidate;

 }

}

Похожий способ описан в Microsoft Knowledge Base (Q141334 – проект VSWAP32).

Ilya Zharkov
Перейти на страницу:

Похожие книги

Программист-прагматик. Путь от подмастерья к мастеру
Программист-прагматик. Путь от подмастерья к мастеру

Находясь на переднем крае программирования, книга "Программист-прагматик. Путь от подмастерья к мастеру" абстрагируется от всевозрастающей специализации и технических тонкостей разработки программ на современном уровне, чтобы исследовать суть процесса – требования к работоспособной и поддерживаемой программе, приводящей пользователей в восторг. Книга охватывает различные темы – от личной ответственности и карьерного роста до архитектурных методик, придающих программам гибкость и простоту в адаптации и повторном использовании.Прочитав эту книгу, вы научитесь:Бороться с недостатками программного обеспечения;Избегать ловушек, связанных с дублированием знания;Создавать гибкие, динамичные и адаптируемые программы;Избегать программирования в расчете на совпадение;Защищать вашу программу при помощи контрактов, утверждений и исключений;Собирать реальные требования;Осуществлять безжалостное и эффективное тестирование;Приводить в восторг ваших пользователей;Формировать команды из программистов-прагматиков и с помощью автоматизации делать ваши разработки более точными.

А. Алексашин , Дэвид Томас , Эндрю Хант

Программирование / Книги по IT
Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ
Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ

Эта книга представляет собой перевод третьего издания американского бестселлера Effective C++ и является руководством по грамотному использованию языка C++. Она поможет сделать ваши программы более понятными, простыми в сопровождении и эффективными. Помимо материала, описывающего общую стратегию проектирования, книга включает в себя главы по программированию с применением шаблонов и по управлению ресурсами, а также множество советов, которые позволят усовершенствовать ваши программы и сделать работу более интересной и творческой. Книга также включает новый материал по принципам обработки исключений, паттернам проектирования и библиотечным средствам.Издание ориентировано на программистов, знакомых с основами C++ и имеющих навыки его практического применения.

Скотт Майерс , Скотт Мейерс

Программирование, программы, базы данных / Программирование / Книги по IT
Программирование. Принципы и практика использования C++ Исправленное издание
Программирование. Принципы и практика использования C++ Исправленное издание

Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие. Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток. Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».

Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова

Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT