Форум программистов, компьютерный форум CyberForum.ru

Помогите с documen/view - C++

Восстановить пароль Регистрация
 
Tremr
Сообщений: n/a
02.09.2010, 18:57     Помогите с documen/view #1
Прошу помощи в следующем вопросе.
Есть MDI-проект. В нем есть один документ (может надо использовать SDI?). Для этого документа надо создать несколько представлений. Вопрос, как это сделать в рамках архитектуры документ/представление?
Одно представление создается с помощью шаблона, т. е. объект объявлять не надо. Но мне необходимо три разных представления на экране сразу и, возможно, еще парочка в виде немодальных диалогов.
Есть возможность разбить имеющийся документ на несколько, так как некоторые представления работяют с разными данными (которые у меня сейчас в одном документе). Но если задавать несколько шаблонов, то при старте выскакивает окно выбора типа нового документа. А это мне не нужно. Так как редактироваться должна только одна часть (структура типа дерева) а остальные части (списки) должны создаваться на ее основе в процессе работы программы.
В общем в голове моей полнейший сумбур. Помогите!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.09.2010, 18:57     Помогите с documen/view
Посмотрите здесь:

C++ Люди помогите с Tree View Control
C++ VS 2008 SP1 - не обновляется Class View
Заполнить область view паттерном из bitmap C++
C++ Что такое Model - View - Controller

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ShepA
Сообщений: n/a
04.09.2010, 12:23     Помогите с documen/view #2
Проблему мжно решить и через SDI. Для этого надо добавить нужный класс вида(через AddClass). Окно можно разбить с помощью сплиттера. Для этого в классе производном от Frame нужно создать переменную типа CSplitterWnd, затем в функции этого класса CreateClient создать сам сплиттер и вид. Например так(пример для MDI взят из MSDN):
Код
// this function creates the panes for a static splitter window
BOOL CChildFrame::OnCreateClient( LPCREATESTRUCT lpcs, 
   CCreateContext* pContext)
{
   BOOL bCreateSpltr = m_wndSplitter.CreateStatic( this, 2, 1);
   // COneView and CAnotherView are user-defined views derived 
//from CMDIView

   m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(COneView), CSize(0,0), 
      pContext);
   m_wndSplitter.CreateView(1,0,RUNTIME_CLASS(CAnotherView), CSize(0,0), 
      pContext);

   return (bCreateSpltr);
}
Функции для работы со сплиттером можно посмотреть в MSDN, их не так уж и много.
Tremr
Сообщений: n/a
04.09.2010, 17:13     Помогите с documen/view #3
Спасибо. Как вариант годится. Но в идеале мне нужны отдельные окна, чтобы двигать их, скрывать высвечивать и т. д. Может знаете как это сделать?
ShepA
Сообщений: n/a
06.09.2010, 11:08     Помогите с documen/view #4
Можно попробывать такой вариант:
Код
BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
	// TODO: Add your specialized code here and/or call the base class
	
	
	if(count%2!=0)
	 pContext->m_pNewViewClass=RUNTIME_CLASS(CMyForm);
	else
	 pContext->m_pNewViewClass=RUNTIME_CLASS(CMyTree);
		
	count++;
	CWnd *pWnd = CreateView(pContext);
	pWnd->ShowWindow(SW_SHOW);
	pWnd->SetActiveWindow();
	return CMDIChildWnd::OnCreateClient(lpcs, pContext);
}
Здесь count - глобальная переменная, Классы CMyTree, CMyForm вставил сам. Теперь при создании нового документа они будут создаваться с разными видами. С обменом информацией не пробывал(нет времени), но думаю проблем не возникнет
Tremr
Сообщений: n/a
06.09.2010, 15:34     Помогите с documen/view #5
Спасибо. Я уже сам нашел эту функцию, но еще не разобрался с ее использованием.
В этом варианте, насколько я понимаю, создается новый документ. А как добавить вид к существующему? И кто вызывает эту функцию?
Я пробовал работать с главным фреймом, но у него нет функций типа InitInstance (или есть?), которые запускаются при его создании. Я пробовал создавать виды в OnCreate() но начинается злобный скулеж VisualC, странно тулбары и статусбары там создаются нормально. Еще мне кажется что главный фрейм не управляет собственноручно дочерними, имеются намеки на какой-то дополнительный класс.
Tremr
Сообщений: n/a
08.09.2010, 19:20     Помогите с documen/view #6
Я нашел решение! Урррааа!!! Может кому будет интересно. Вот оно.

AppWizard для MDI интерфейса создает три класс рожденные, соответственно, от CDocument, CMDICildWnd (фрейм) и CView (этот класс мы допустим рождаем от CTreeView).

Создаем еще два класса рожденные соответственно от CMDICildWnd (фрейм) и, например, CListView.
Класс фрейма назовем CMyListFrame. А клас вида - CMyListView. Классы, которые создал AppWizard, пусть называются CMyDoc, CChildFrame, CChildView.

Если запустить программу сейчас, то в главном ее окне появится одно окно CChildFrame с CChildView внутри.
Можно сколько угодно таких окон выспетить, добавив несколько простых команд. Но чтобы к имеющемуся документу добавить еще одно отдельное окно с другим видом, нужно постараться. Что я и делал, причем долго безуспешно.

Решение лежит в классе шаблона документа CMultiDocTemplate. Вернее там лежит невозможность решения. Если посмотреть текст функции родительского класса CDocTemplate::CreateNewFrame, которая отвечает за создание фрейма с прикрепленными к нему видом и документом, то можно увидеть, что функция создает фрейм того класса который был задан при создании самого шаблона.
Когда я просмотрел на эту функцию у меня родилась идея создавать фрейм другого класса. Как это осуществить?
Надо создать, ни много ни мало, дочерний к CMultiDocTemplate класс. В котором написать
функцию полностью повторяющую CDocTemplate::CreateNewFrame, но вместо записанного в шаблоне класса для фрейма использовать другой класс. Например тот, который будет передан в эту функцию в качестве параметра (необходимо использовать CRuntimeClass*).

Теперь в функции C<имя пректа>App::InitInstance надо просто подменить тип указателя шаблона документ с CMultiDocTemplate на написанный нами дочерний класс шаблона. Ну и соответственно вызвать конструктор этого класса. А потом где-либо запускать функцию для создания нового фрейма, которую мы написали для дочернего шаблона документа.
И все создастся новый фрейм заданного класса.

Теперь еще одно. Чтобы фрейм нового класса присоединял к себе другой вид. Для этого существуюет функция OnCreateClient. Ее необходимо переопределить в классе этого фрейма примерно так, как написал в этой теме камрад ShepA. Кстати большое ему за это спасибо.

В итоге для каждого нового типа окна нам надо написать новый класс вида и новый класс фрейма, в функции OnCreateClient которого мы прописываем прикрепление этого вида.

Если кому непонятно, а понять хочется, пишите мне на tremr@mail.ru. Я вышлю вам свой проект реализующий эту фичу.
Yandex
Объявления
08.09.2010, 19:20     Помогите с documen/view
Ответ Создать тему
Опции темы

Текущее время: 12:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru