![]() Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Архитектура документ-вид и диалоговое окно
Как получить доступ к документу из диалогового окна Первый способ Допустим, имеется проект, шаблон которого создан с помощью мастера MFC AppWizard (exe) и при его создании был выбран тип приложения, поддерживающий архитектуру документ-вид (Document/View architecture support) с одним документом (single document). Допустим также, для конкретности, что классы названы так (имя каталога с проектом Get_Doc_from_Dialog, а имя проекта – Constr): CConstrDoc – класс документа; CConstrView – класс вида; CMyDialog – класс диалогового окна.
Теперь предположим, что нам требуется отображать в управляющих элементах диалогового окна некоторые данные документа. Рекомендуемым Microsoft подходом является получение доступа к документу из методов класса вид с помощью получения указателя на документ CConstrDoc *pDoc=GetDocument();
Теперь мы можем «добраться» до данных с помощью квалифицированного имени Если все же требуется получить доступ к данным документа непосредственно из методов класса диалог, то надо как-то передать указатель на документ в класс диалога. Сделать это можно, модифицировав конструктор диалогового окна. Изменим объявление конструктора диалогового окна в файле 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; просмотров: 440. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |