SDI中类与类的关系



这张图也是个高人给我的,感觉有点像什么藏宝图似的.不过仔细一看,可能你真的会发现宝藏:

1. SDI是一中文档视图结构,由于文档视图与框架是相互联系的,彼此都包含了指向对方的指针,所以得有一个东西来管理他们,协调他们.文档模板就是这个作用:

它的构造函数如下:

pDocTemplate (
 UINT nIDResouce,CRunTimeClass* pDocClass,CRuntimeClass * pFrameClass,CRuntimeClass* pViewClass);

那么这个对象是什么时候构造的呢?

BOOL CMyApp::InitInstance()
{
 AfxEnableControlContainer();

......

 CSingleDocTemplate* pDocTemplate;

pDocTemplate = new CSingleDocTemplate(
  IDR_MAINFRAME,
  RUNTIME_CLASS(CMyDoc),
  RUNTIME_CLASS(CMainFrame),       // main SDI frame window
  RUNTIME_CLASS(CMyView));
 AddDocTemplate(pDocTemplate);

这就是先构造了个文档模板类指针,然后添加到文档模板链表(AddDocTemplate(pDocTemplate);)

2.

在OnNewDocument创建一份文档时,程序会调用很多函数(已经封装),有一个是 CSingleDocTemplate::OpenDocumentFile,接着该函数就会调用 CreateNewDocument,CreateNewFrame等来创建一个新的文档类对象,框架类对象和视类对象.一起为这份文档服务.

3.CSingleDocTemplate::OpenDocumentFile该函数会被调用的原因就是因为前面创建了单文档模板指针,添加进指针链表中,尔后又被其他函数从指针链表取出这个文档模板指针,从而实现调用,

4.上面的图已经很清楚的说明几个重要的类之间的关系,其中m_开头的都表示是该类中的成员变量,指向其他的类,当然也可以用成员函数来获得其他类的指针,如:

获得框架指针:用全局函数AfxGetMainWnd(),在视类中用GetParent();

获得视类指针:在框架类中用GetActiveView(),在文档类中用GetNextView(),在其他地方用AfxGetMainWnd()->GetActiveView()

获得文档类指针:在视类中用Get Document(),在框架类中用GetActiveDocument();

获得应用程序类指针:任何地方调用AfxGetApp(),因此如果要定义全局变量,那么在应用程序类中定义是个不错的办法


转自http://blog.programfan.com/article.asp?id=18769

你可能感兴趣的:(SDI中类与类的关系)