Лабораторная работа №6-7 СОЗДАНИЕ ПРИЛОЖЕНИЙ С ОДНО-ДОКУМЕНТНЫМ ИНТЕРФЕЙСОМ

Цель работы - приобретение навыков построения приложений, основанных на одно-документном интерфейсе и архитектуре документ - вид, с использованием инструментальных средств, студии разработчика Visual C++.

Центральными объектами в архитектуре документ - вид являются документы, которыми могут быть тексты, таблицы, карты, мелодии, сцены и т.д. Они ориентированы на хранение информации и имеют хорошо развитые методы загрузки, сохранения и управления данными. Документы создаются как объекты классов, производных от класса CDocument библиотеки классов MFC.

Каждый документ сопровождается одним или несколькими объектами, которые определяют вид или облик этого документа на экране. Через облики происходит взаимодействие пользователя с документами. Облик является объектом, предназначенным для отображения документа на экране и распознавания команд пользователя по управлению документом. Для изменения документа облики используют методы документа. Облики создаются как объекты классов, производных от классов CView, библиотеки классов MFC. Кроме класса CView, библиотека MFC содержит ряд классов, производных от CView, которые также можно применять для создания новых классов обликов, например, класс CFormView.

Каждый облик должен быть сопоставлен некоторому документу. Один документ может иметь несколько обликов и в таком случае они, как правило, обеспечивают различное представление документа на экране: в виде таблицы, в виде графика, в виде диаграммы и т.д.

Создание документов и обликов производится каркасом приложения на основе документных шаблонов, являющихся объектами класса CDocTemplate или производных от него классов. Документы шаблоны задают описание наиболее существенной части архитектуры документ - вид, включая описание класса документа, класса облика документа и класса окна - рамки документа. Документные шаблоны бывают двух типов: для одно-документного интерфейса SDI и многодокументного MDI.

Создание документа и связанных с ним объектов выполняется в начале работы приложения, а также когда пользователь выбирает команды New или Open в меню File. Создание начинается с выбора шаблона документа. В соответствии с описанным в шаблоне классом документа создается сам документ. Если шаблон задает MDI-интерфейс, то каждый раз создается новый объект - документ. Если же шаблон задает SDI-интерфейс, новый объект - документ создается только один раз, а при выборе пользователем команд New или Open производится только обнулением имеющегося объекта.

Для инициализации созданного документа каркас приложения вызывает метод OnNewDocument при открытии нового документа и метод OnOpenDocument при открытии имеющегося. Оба метода являются виртуальными и их можно переопределять, при этом необходимо вызывать методы базового класса. Для инициализации используется также и конструктор документа.

После создания документа создается объект главное окно - рамка, которое управляет главным Windows-окном приложения. Внутри этого окна располагаются окна - рамки документов. Объект окно -рамка документа создается главным окном - рамкой и служит для управления Windows-окном, внутри которого облик отображает содержимое документа. Окно - рамка документа как раз и создает объект -облик. Если открывается уже существующий документ, то для его загрузки используется метод Serialize. Этот же метод используется для сохранения документа при его закрытии.

Қайырбек А. Ж.

Заключительный этап создания документа и связанных с ним объектов включает инициализацию облика и отображение содержимого документа посредством этого облика.

Логически облики привязаны к документу. Класс CDocument инкапсулирует список, хранящий все облики данного документа. Специальные методы позволяют добавлять и удалять элементы, производить просмотр списка и получать облики.

Метод класса CView позволяет облику получать документ, за которым он закреплен:

CDocument* GetDocument() const;

Этот метод возвращает NULL, если _облик не закреплен ни за каким документом.Если документ использует несколько обликов, один из которых изменяет этот документ, то остальные облики должны синхронизировать своё отображение с изменяемым содержанием этого документа. Такую синхронизацию обеспечивают методы UpdateAllView класса CDocument и OUpdate класса CView:

void UpdateAllViews(CView* pSender, LPARAM lHint=0L,CObject* pHint=NULL);

virtual void OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint);

Здесь pSender - указатель отправителя сообщения Update;lHint - числовой параметр сообщения;pHint - параметр - объект сообщения.

Задание №1.

Создать приложения с одно-документным интерфейсом, реализующие диалог пользователя с компьютером, выполнив следующие действия:Создать остов приложения, основанного на одно-документном интерфейсе SDI,задав имя Scene и выбрав подходящий
каталог, при этом на этапе модификации созданных классов для класса Scene View заменить базовый класс С View на класс CFormView, что позволит в окне установить управляющие элемены.

1. Включить в файл SceneDoc.h описания переменных ys и cs, хранящие состояние персон You и Computer - NO TALK, TALK, DOUBLE TALK и FINISH TALK:

//Attributes

public:

enum State {NO TALK,TALK,DOUBLE TALK,FINISH TALK};

State ys;//-состояние персоны You;

State cs;//-состояние персоны Computer;

3. Включить в файл SceneDoc.h описание методов, изменяющих документ в результате действий, предпринимаемых персонами You и Computer соответственно:

//Operations

public:

CString YouChange(); //для изменения состояния You;

CString ComputerChange(BOOL *NameFlag); //для изменения состояния Computer;

4. В файле SceneDoc.cpp переопределить виртуальный метод инициализации документа:
BOOL CSceneDoc::OnNewDocument()

{if (!CDocument::OnNewDocument())

return FALSE;

ys=cs=NO_TALK;//-начальное состояние персон; return TRUE;

}

5. В конце файла Scene Doc.cpp добавить реализации новых методов YouChange() и ComputerChange(BOOL* NameFlag):

CString CSceneDoc::YouChange() { switch (ys)

{ case NO_TALK: ys=TALK;

return ("Привет компьютер!"); case TALK: ys=DOUBLE TALK;

return ("Компьютер,проснись!"); case DOUBLE_TALK: cs=TALK;

return ("Поздоровайся,наконец!");

} return ("");

}

CString CSceneDoc::ComputerChange(BOOL *NameFlag) { *NameFlag= FALSE; switch (cs) { case TALK: ys=FINISH_TALK;

cs=DOUBLE TALK;

return ("Совет дня. Никогда не разговаривайте с неизвестными! Ваше имя, пожалуйста.");

case DOUBLE_TALK: cs=FINISH_TALK; *NameFlag=TRUE; return ("Здравствуйте,люди! Всегда рад с Вами работать!");

} return ("");

}

6. Отредактировать ресурс IDD_SCENE_FORM класса CSceneView, включив в него командные кнопки IDC_You и IDC_Comp, окна редактирования IDC_EDYou и IDC_EDComp.

7. В файле CSceneView.h модифицировать класс CSceneView, добавив две переменные m_ye и m_ce для обмена данными с окнами редактирования IDC_EDYou и IDC_EDComp, а также два метода OnYou() и OnComp() для обработки сообщений BN_CLICKED от кнопок IDC_You и IDC_Comp.

8. В файле CSceneView.cpp добавить операторы для методов OnYou() и OnComp():

void CSceneView: :OnYou() { CString Str;

Str=GetDocument()->YouChange();

m_ye. SetWindowText( Str);

void CSceneView::OnComp() { BOOL NameFlag; CString Str,Name; INT Pos;

Str=GetDocument()->ComputerChange(&NameFlag); If (NameFlag)

{m_ye.GetWindowText(Name); if(!Name.IsEmpty())

Str=Str.Left(Pos=Str.Find("люди"))+Name+Str.Mid(Pos+4);

} m_ce.SetWindowText(Str);

}

9. Скомпилировать приложение и проверить выполняемые им функции.

Контрольные вопросы:

1. Объяснить, каким образом производится создание документов и их обликов.

2. Перечислить классы библиотеки MFC, производные от классов CDocument и CView.

3. Объяснить назначение документных шаблонов и их структуру.

4. Сколько раз создается объект - документ при работе SDI-приложения?

5. Какими методами инициализируется объект - документ?

6. Объяснить взаимодействие главного окна - рамки, окна - рамки - документа и окна - облика.

7. Каково назначение метода Serialize?

8. Где хранится список обликов документа?

9. Как обеспечивается взаимосвязь документа и облика?

10.Как обеспечивается синхронизация работы обликов для одного и того же документа?

11.Какова роль документа в создаваемом приложении Scene?

12.Используя справочную систему Visual C++, подготовить и запомнить сведения о следующих методах: CsceneDocument:: GetDocument; CEdit:: SetWindowText; CEdit:: GetWindowText; CString:: Find; CString: :Left; CString: Mid; CString::IsEmpty.

Қапбар М. А.

Наши рекомендации