Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Как получить текущий CDocument или CView из любого места программы
В приложениях MFC очень часто бывает необходимо получить указатель на активный документ или Вид из любого места программы. Например, иногда полезно иметь доступ к документу из диалогового окна. В данной статье обсуждаются простейшие методы того, как это сделать используя связи между объектами MFC и основной архитектурой MFC.
Как уже упоминалось, один из случаев, когда может потребоваться указатель на текущий активный Вид или документ, это модальное или немодальное диалоговое окно. Вообще-то, диалоговое окно должно быть создано классом Вида, так Вид имеет прямое отношение к пользовательскому интерфесу приложения.
Так как класс Вид создаёт диалоговое окно, то он может передать диалоговому окну указатель на самого себя либо на активный документ [полученный функцией GetActiveDocument()]. Это можно сделать через конструктор диалога либо через другую функцию-член. Для модальных диалогов Вид также может помещать данные из диалогового окна в документв тот момент, когда DoModal() возвращает управление.
Чтобы получить указатель на текущий активный документ из любого места программы, добавьте статическую функцию-член в Ваш класс, наследованный от CDocument, как показано ниже:
В заголовочном файле документа, добавляем статическую функцию GetDoc(): // Заголовочный файл документа class CMyDoc : public CDocument { ... public: static CMyDoc * GetDoc(); ... };
Для однодокументного приложения (SDI), добавляем следующий код функции CMyDoc::GetDoc(): // файл исходника SDI документа CMyDoc * CMyDoc::GetDoc() { CFrameWnd * pFrame = (CFrameWnd *)(AfxGetApp()->m_pMainWnd); return (CMyDoc *) pFrame->GetActiveDocument(); }
Для многодокументного приложения (MDI), код функции CMyDoc::GetDoc() будет выглядеть следующим образом: CMyDoc * CMyDoc::GetDoc() { CMDIChildWnd * pChild = ((CMDIFrameWnd*)(AfxGetApp()->m_pMainWnd))->MDIGetActive();
if ( !pChild ) return NULL;
CDocument * pDoc = pChild->GetActiveDocument();
if ( !pDoc ) return NULL;
// Ошибка, если документ неправильного типа if ( ! pDoc->IsKindOf( RUNTIME_CLASS(CMyDoc) ) ) return NULL;
return (CMyDoc *) pDoc; }
Чтобы получить указатель на текущий активный Вид из любого места программы, добавьте статическую функцию-член в Ваш класс, наследованный от CView как показано ниже:
В заголовочном файле Вида добавляем статическую функцию GetView(): // Заголовочный файл Вида class CMyView { ... public: static CMyView * GetView(); ... };
Для SDI приложения тело функции CMyView::GetView() будет выглядеть следующим образом: // View implementation file CMyView * CMyView::GetView() { CFrameWnd * pFrame = (CFrameWnd *)(AfxGetApp()->m_pMainWnd);
CView * pView = pFrame->GetActiveView();
if ( !pView ) return NULL;
// Ошибка, если Вид неправильного типа // (это может случиться с окнами разделителями (splitter windows), // либо с дополнительными Видами в одном документе if ( ! pView->IsKindOf( RUNTIME_CLASS(CMyView) ) ) return NULL;
return (CMyView *) pView; }
Для многодокументного приложения (MDI), код функции CMyView::GetView() будет выглядеть следующим образом: // MDI view implementation file CMyView * CMyView::GetView() { CMDIChildWnd * pChild = ((CMDIFrameWnd*)(AfxGetApp()->m_pMainWnd))->MDIGetActive();
if ( !pChild ) return NULL;
CView * pView = pChild->GetActiveView();
if ( !pView ) return NULL;
// Ошибка, если Вид неправильного типа if ( ! pView->IsKindOf( RUNTIME_CLASS(CMyView) ) ) return NULL;
return (CMyView *) pView; }
Теперь, из любого места Вашей программы где включён заголовочный файл документа или Вида можно вызвать: CMyDoc::GetDoc();
или CMyView::GetView();
чтобы получить указатель на текущий активный документ или Вид соответственно. Если нет ни одного активного документа или Вида, то эти функции вернут NULL. Получив такой указатель, Вы можете обращаться к членам Вашего нового класса. Отображение данных в управляющих элементах диалогового окна и их получение (MVS 6.0) Рекомендуемые приемы работы с управляющими элементами диалоговых окон (поля редактирования Edit, списки и пр.) описаны в лабораторной работе «Разработка приложения с модальным диалоговым окном и архитектурой документ-вид» и у Круглински. Кроме того, в перекрытой функции CDialog::OnInitDialog(), которая вызывается перед прорисовкой диалогового окна, можно воспользоваться функцией SetDlgItemText() для задания значения, например, для поля редактирования: BOOL CMyDialog::OnInitDialog() { CDialog::OnInitDialog(); SetDlgItemText(IDC_EDIT1,"Мой текст"); return TRUE; }
Предполагается, что в диалоговом окне имеется элемент редактирования с идентификатором IDC_EDIT1.
|
||
Последнее изменение этой страницы: 2018-04-12; просмотров: 391. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |