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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Tremr
Сообщений: n/a
#1

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

02.09.2010, 18:57. Просмотров 733. Ответов 5
Метки нет (Все метки)

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

Люди помогите с Tree View Control - C++
Добрый день! Помогите пожалуйста с элементом просмотра дерева (Microsoft Visual C++ 6) Проблема-создаю приложение (на API). Главное...

Model view controller - C++
Доброго времени суток. Решая проблему своих задач ( изучаю ооп + пишу проги), я невольно костыльно сам пришел к идее, что логика проекта...

VS 2008 SP1 - не обновляется Class View - C++
Не знаю, куда спросить, тему с техническими вопросами не нашел... Создаю класс, а окно Class View не обновляется... Просто там нет этого...

Что такое Model - View - Controller - C++
Приветствую всех. Можете, пожалуйста, в двух словах объяснить что такое Model View Controller? Читаю в инете, много лишнего и не...

Заполнить область view паттерном из bitmap - C++
Как можно закрасить область view окна паттерном, взятым их битмапа (нужно получить область view закрашенную шахматной доской и есть битмап,...

Помогите с Resource View!!! - C#
Нород, помогите... У меня VS 2005 почему то перестал отображать содержимое окна Resource View...:mad::mad::mad: как вернуть? очень надо!

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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, странно тулбары и статусбары там создаются нормально. Еще мне кажется что главный фрейм не управляет собственноручно дочерними, имеются намеки на какой-то дополнительный класс.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2010, 19:20     Помогите с documen/view
Еще ссылки по теме:

чему когда используешь documen.write(...) на html странице этот метод затирает все содержимое страницы? - C# ASP.NET
Почему когда используешь documen.write(...) на html странице этот метод затирает все содержимое страницы, если же на ASP то нет?

Как во view добавить вычисляемую колонку с порядковым номером записи во view? - SQL Server
Как во view добавить вычисляемую колонку с порядковым номером записи во view?

view с чего состоит и что выполняет каждая функция в view? - Delphi
Буду очень благодарен за ответ!!

Tree View + List View. Как из програмы определить в чем именно на данный момент выделен елемент ? - Visual Basic
У меня на одной форме радом сидят Tree View и List View (как в explore). Вопрос: как из програмы определить в чем именно (в Tree View или в...

Ng-view внутри ng-view - AngularJS
Добрый день. А можно внутри одной ng-view сделать еще одну ng-view? Т.е. основной документ куда вставляется шаблон: <html> <body> ...

View - Oracle
Доброго времени суток. Есть 4 таблицы. Справочник товаров, справочник клиентов, таблицы цен и таблица расходных документов. Есть условие...


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

Или воспользуйтесь поиском по форуму:
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
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru