Иллюстрированный самоучитель по Visual Studio.Net


Взаимодействие представлений документа - часть 5


Команда доступна только в режиме отладки (F5):

void CTreeDoc::FreeDocs()

{

m_sFiles.clear(); m_Shapes.clear();

//====== Выясняем адрес правого окна

CRightView *pView = dynamic_cast<CRightView*>

(GetView(RUNTIME_CLASS(CRightView)));

//====== Освобождаем окна-картинки

if (pView) pView->Clear();

}

При обращении к функции Getview мы должны подать на вход адрес структуры CRuntimeClass, которая характеризует искомый класс. Это можно сделать двумя способами: используя макроподстановку RUNTIME_CLASS(), как и сделано выше, или подставив более длинное, но разъясняющее суть макроса, выражение:

Getview(SCRightView::classCRightView)

Выражения:

RUNTIME_CLASS(CRightView)

И

&CRightView::classCRightView

эквивалентны. Вторая форма записи подсказывает вам, что в классе CRightView определена статическая переменная classCRightview типа CRuntimeClass, которая помогает по адресу объекта определить его тип на этапе выполнения.

Рассмотрим метод ProcessDocs класса CTreeDoc, который обрабатывает информацию о файлах документов, обнаруженных в текущей папке. Здесь демонстрируется, как связать архив (объект класса CArchive) с файлом (объектом класса CFile) и заставить объект прочесть данные из файла. Для этой цели используется всего" один временный объект poly класса с Polygon. Данные очередного документа сначала читаются из файла в этот объект — poly. Serialize (ar); а затем весь объект помещается в контейнер — m_Shapes .push_back (poly). Контейнеры устроены таким образом, что они создают свою собственную копию объекта и именно ее и хранят. Благодаря этому мы можем многократно использовать временный объект poly:

void CTreeDoc::ProcessDocs()

{

UINT nFiles = m_sFiles.size();

//====== Если документы не обнаружены

if (!nFiles)

return;

for (UINT i=0; i < nFiles; i++)

{

//====== Читаем все документы

GFile file; // Класс, управляющий файлами

CFileException e; // Класс для обработки сбоев

CString fn = m_sFiles[i); // Имя файла

if (Ifile.Open (fn, CFile::modeRead |



Начало  Назад  Вперед