Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Архитектура документ-вид и диалоговое окно




Как получить доступ к документу из диалогового окна

Первый способ

Допустим, имеется проект, шаблон которого создан с помощью мастера MFC AppWizard (exe) и при его создании был выбран тип приложения, поддерживающий архитектуру документ-вид (Document/View architecture support) с одним документом (single document). Допустим также, для конкретности, что классы названы так (имя каталога с проектом Get_Doc_from_Dialog, а имя проекта – Constr):

CConstrDoc – класс документа;

CConstrView – класс вида;

CMyDialog – класс диалогового окна.

 

Теперь предположим, что нам требуется отображать в управляющих элементах диалогового окна некоторые данные документа. Рекомендуемым Microsoft подходом является получение доступа к документу из методов класса вид с помощью получения указателя на документ

CConstrDoc *pDoc=GetDocument();

 

Теперь мы можем «добраться» до данных с помощью квалифицированного имени
pDoc->Данное. Так как обычно диалоговое окно создается каким-либо из методов класса вид, то нет никаких проблем передать теперь данные в диалоговое окно (см. лаб. работу «Разработка приложения с модальным диалоговым окном с архитектурой документ-вид»).

Если все же требуется получить доступ к данным документа непосредственно из методов класса диалог, то надо как-то передать указатель на документ в класс диалога. Сделать это можно, модифицировав конструктор диалогового окна.

Изменим объявление конструктора диалогового окна в файле MyDialog.h и добавим в класс член-данное CDocument *pDOC:

class CMyDialog : public CDialog

{

public:

CMyDialog(CDocument * pdoc);

// …

protected:

CDocument *pDOC;

 

Соответственно, в файле MyDialog.cpp опишем такую реализацию конструктора

CMyDialog::CMyDialog(CDocument* pdoc ) : CDialog(CMyDialog::IDD, NULL)

{

//{{AFX_DATA_INIT(CMyDialog)

   // NOTE: the ClassWizard will add member initialization here

//}}AFX_DATA_INIT

pDOC=pdoc;

}

 

В том методе класса вид, где создается диалоговое окно (это может быть обработчик нажатия какой-нибудь кнопки или темы меню), надо поступить так:

CConstrDoc *pDoc=GetDocument();

CMyDialog dlg((CConstrDoc*) pDoc);

// …

dlg.DoModal();// показываем диалоговое окно

 

Само собой разумеется, что надо подключить заголовочный файл ConstrDoc.h к файлу MyDialog.cpp для того, чтобы было видно объявление класса CConstrDoc.

Теперь в классе диалог мы получаем доступ к данным документа таким образом:

BOOL CMyDialog::OnInitDialog()

{

CDialog::OnInitDialog();

CConstrDoc * pdc = (CConstrDoc *)pDOC;

pdc->член-данное…;

// ((CConstrDoc *) pDOC)-> член-данное…; - можно и так, но длинно

return TRUE;

}

 

Само собой разумеется, что так же можно вызывать и методы объекта документ.


Второй способ

Он описан в сценарии лаб. раб. «Разработка приложения с модальным диалоговым окном и архитектурой документ-вид», который изложен в файле Stip_Labs.doc.

Как получить доступ к представлению из диалогового окна

Предположим, есть оконное приложение с архитектурой документ-вид (представление) и диалоговым окном. Диалоговое окно, как обычно, создается по команде меню, обработчик которой является методом класса вид. Требуется получить доступ из (методов) диалогового окна (класс CMyDialog) к окну вида (класс CLab3View).

Идея заключается в использовании глобально объявленного указателя CView *gpView на объект класса вид (именно CView как родительского класса для CLab3View, но это не принципиально).

Объявим этот указатель где-нибудь в начале файла MyDialog.cpp, допустим, перед реализацией конструктора класса CMyDialog:

CView *gpView;

 

В заголовочном файле MyDialog.h объявим его же как внешний, так как именно этот заголовочный файл подключается, как водится, к файлу вида Lab3View.cpp:

extern CView *gpView;

 

В конструкторе класса CLab3View (файл Lab3View.cpp) инициализируем этот указатель:

CLab3View::CLab3View()

{

gpView=this;

}

 

Теперь можем использовать этот указатель в методах класса диалога, например, так:

CDC *pdc=gpView->GetDC();

pdc->TextOut(0,0,_T("Этот текст попал в окно вида"));

 

 

 

Еще один вариант решения похожей задачи предлагает неизвестный автор по ссылке http://netcode.ru/cpp/?lang=&katID=6&skatID=44&artID=567. Вот текст ссылки без правки.

 










Последнее изменение этой страницы: 2018-04-12; просмотров: 360.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...