http://tikitak.narod.ru ---- Главная страница сайта
Шаг 22 - Организуем связь докумен-вид
" Войди в меня , войди в мои сны
Войди в мои сны они так важны "
Ирина Алегрова
К Документ - Вид подходит очень.
Создание проекта
Проект остается, но весь код я приведу опять. Дело в том, что для реализации связи документ-вид, класс документа должен быть обявлен первым. Все изменения я выделил жирным.
Создаем код
#include "afxwin.h"
#include "resource.h"
class CMyDoc : public CDocument
{
protected:
CMyDoc();
DECLARE_DYNCREATE(CMyDoc)
public:
CString GetDate();
private:
CString csDate;
};
IMPLEMENT_DYNCREATE(CMyDoc, CDocument)
CMyDoc::CMyDoc()
{
csDate="Hello View - Doc";
}
CString CMyDoc::GetDate()
{
return csDate;
}
class CMyView : public CView
{
protected:
CMyView();
DECLARE_DYNCREATE(CMyView)
public:
void OnDraw(CDC* pDC);
CMyDoc* GetDocument();
};
CMyDoc* CMyView::GetDocument()
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));
return (CMyDoc*)m_pDocument;
}
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* tempDoc=GetDocument();
pDC->TextOut(10,10,tempDoc->GetDate());
}
IMPLEMENT_DYNCREATE(CMyView, CView)
CMyView::CMyView()
{
}
class CMainFrame : public CFrameWnd
{
protected:
CMainFrame();
DECLARE_DYNCREATE(CMainFrame)
public:
};
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
CMainFrame::CMainFrame()
{
}
class CStep2App : public CWinApp
{
public:
CStep2App();
virtual BOOL InitInstance();
};
BOOL CStep2App::InitInstance()
{
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CMyDoc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CMyView));
AddDocTemplate(pDocTemplate);
CCommandLineInfo cmdInfo;
if (!ProcessShellCommand(cmdInfo))
return FALSE;
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return TRUE;
}
CStep2App::CStep2App()
{
}
CStep2App theApp;
Описание
В классе документа должны находится данные. Вот мы их и обьявили в виде строки CString csDate. Так как данные должны быть защищены то я их поместил в private: это соотвествует правилам классического программирования (ООП). Для доступа создал функцию CString GetDate(). С ней я думаю просто, она возвращает строку.
Вид должен иметь возможность доступа к документацию. Для этого создана функция СMyDoc* GetDocument(); в классе вида. Она возвращает указатель на класс документа. Именно указатель нам и нужен.
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc))); Вобщем по русcки это так. Проверить принадлежность указателя m_pDocument на принадлежность классу CMyDOC IsKindOf(RUNTIME_CLASS(CMyDoc)) и проверить чтобы этот класс существовал ASSERT(.....)
Если все нормально вернуть указатель на класс документа - return (CMyDoc*)m_pDocument;
И изменили функцию прорисовки OnDraw. В этой функции мы получаем класс документа и выводим на экран строку.
Так вот, вникайте. Если вы захотите изменить вывод допустим шрифт букв, или место строки, то за всё это отвечает класс просмотра CView, а если необходимо изменить содержание строки то это делается в классе документа CDocument.
Шпаргалка
В классе документа создай данные и доступ к ним.
class CMyDoc : public CDocument
{
..................
public:
CString GetDate();
private:
CString csDate;
};
В классе вида реализуй доступ к классу документа
class CMyView : public CView
{
..........
CMyDoc* GetDocument();
..........
}
;
CMyDoc* CMyView::GetDocument()
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));
return (CMyDoc*)m_pDocument;
}
Создай функцию рисования вида
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* tempDoc=GetDocument();
pDC->TextOut(10,10,tempDoc->GetDate());
}
Предыдущий Шаг | Следующий Шаг | Оглавление By Artem.
Используются технологии uCoz
|