Ок. Всё очень просто. Для оконного приложения нам нужно как минимум... окно. Это может быть диалог - контейнер для контролов, типа кнопок, комбобоксов и тд, или фрейм (рамка) - более продвинутый контейнер для других окон, которые могут например изменять свои размеры в пределах (будем называть его правильно) родительского окна.
С диалогами ты уже разобралась.
Фреймовые документы бывают двух типов (Multiple top-level Document отбрасываем и забываем, это извращение над MDI, и если мне не изменяет память в шестёрке такого ещё не было). Итак, двух типов - SDI и MDI. SDI (Single Document) подразумевает работу с одним экземпляром ДАННЫХ в рамках MainFrame. Например, с одим файлом типа TXT. Отличие MDI в том, что он может работать с множеством экземпляров одной модели данных. Но для понимания Doc-View это несущественно. Итак, вернёмся к SDI. Примером такого приложения может служить Блокнот. Ты открываешь (те инициаллизируешь внутреннюю структуру данными) файл и его содержимое отображается в окошке. Отсюда необходимость в двух объектах. Один отвечает за хранение данных - Document, другой отвечает за отображение этих данных - View.
Очевидно, что у одних и тех же данных, может быть несколько ВИДОВ (Views). Пример - Проводник винды. У него есть два вида одних и тех же данных - дерева каталогов и файлов. Обычно слева ты видишь эти данные в виде дерева, а справа в виде списка. Хотя это одна и таже информация.
Другой пример - представь у тебя есть некие столбцы данных. Ты можешь отображать их в виде таблицы и/или в виде графика. Причём эти ВИДЫ можно показывать по очереди (переключателем), или же одовременно - для этого используется элемент управления под названием Splitter (разделитель), который разделяет рамку на две части и предоставляет полученные части независимым ВИДАМ. Каждую такую рамку, в свою очередь можно также разделить на части и тд. Таким образом мы получаем целый список объектов View, в одном документе. И, соответственно, чтобы добраться до искомого, нам необходимо пробежаться по их списку. Для этого используются ф-ции объекта CDocument:
GetFirstViewPosition() - для получения адреса (позиции) первого ВИДА
GetNextView - для получения объекта по адресу.
Последняя возвращает указатель на объект, родительским классом которого является CView. Если тебе необходимо получить доступ к общим ф-ям этого объекта, то кастинг необязателен. Например:
POSITION pos = GetFirstViewPosition();
while (pos != NULL)
{
CView* pView = GetNextView(pos);
pView->UpdateWindow(); // это ф-я объявленная в родительском классе CView
}
Таким образом осуществляется, например, перерисовка всех ВИДОВ одного документа, при изменении данных.
Если же тебе нужен какой-то конкретный ВИД, то перед кастингом (приведением типа к какому-то конкретному значению - в твоём случае это CPr10View), необходимо сначала удостовериться, что полученный указатель является именно искомым объектом.
Ну в принципе ты уже делала нечто подобное, только с документами.
POSITION post1 = AfxGetApp()->m_pDocManager->GetFirstDocTemplatePosition();
CSingleDocTemplate *psdt1 =
(CSingleDocTemplate*)AfxGetApp()->m_pDocManager->GetNextDocTemplate(post1);
POSITION posd1 = psdt1->GetFirstDocPosition();
CPr10Doc *pdoc2 = (CPr10Doc *) psdt1->GetNextDoc(posd1);
Ситуация аналогичная. Только "этажём" выше. Ведь у тебя не обязательно должна быть одна документная модель. Их может быть множество (возьми к примеру любую программу, котрая работает с разным типом данных). Например, VS. В ней ты открываешь проекты, файлы ресурсов, текстовые документы и тд. И всё в пределах одного приложения. Студия поддерживает множественные документные модели, или, проще говоря, может работать с разным типом данных. Соответственно эти разные типы данных (напримре в виде объектов CSingleDocTemplate ) тоже находятся в соответствующем списке "управляющего" документами. Ну и далее ты уже ищешь в списке документов этого объекта нужные тебе данные - GetFirstDocPosition() + GetNextDoc.
Немного понятней стало?
А теперь ответь мне на вопрос, чего ты хотела добиться строчкой:
CPr10View *pView2 = (CPr10View *)AfxGetApp()->GetRuntimeClass();
и что именно делает ф-я
GetRuntimeClass?