SDI程序三元组的产生(VC2005)

SDI程序三元组的产生(VC2005)


    theApp如何构造保存CWinApp指针就跳过了。从 pThread->InitInstance()  开始.
    CWinApp成员m_pDocManager(CDocManager*)用m_templateList (CPtrList)管理CDocTemplate指针列表。而派生自CDocTemplate类的CSingleDocTemplate拥有应用程序的三元组CView、CDocumnet、CFrameWnd派生类的” 名片”(CRuntimeClass指针)。
    应用程序的三元组,在InitInstance中被加入。
CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CMFCDoc), RUNTIME_CLASS(CMainFrame), // 主SDI 框架窗口 RUNTIME_CLASS(CMFCView)); if (!pDocTemplate) return FALSE; AddDocTemplate(pDocTemplate);//加入了CDocManager中theApp与三元组关联一块了!

    接着,下面语句引发窗口的注册与创建。
    调用过程是:


ProcessShellCommand AfxGetApp()->OnCmdMsg(ID_FILE_NEW, 0, NULL, NULL) 
void CWinApp::OnFileNew()
void CDocManager::OnFileNew()
CDocument* CSingleDocTemplate::OpenDocumentFile(LPCTSTR lpszPathName, BOOL bMakeVisible)


    这个函数内创建了文档对象与窗口:


  pDocument = CreateNewDocument();
  pFrame = CreateNewFrame(pDocument, NULL);


    着重介绍CreateNewFrame,其中调用 CFrameWnd::LoadFrame,它利用 VERIFY(AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG));注册了一个默认窗口类叫"AfxFrameOrView80ud",但面后觉得窗口类名字不满意,可能是怕重名吧,又调用 GetIconWndClass改了一个名字,期间调用PreCreateWindow为获得上面注册的默认窗口类类名。GetIconWndClass基本上负责改名,窗口类的其它属性还是默认的。现在好了,有了系统默认的窗口类属性又有了自己的窗口类类名,那创建窗口吧!
    调用BOOL CFrameWnd::Create。在此期间又调用了一次PreCreateWindow为给用户一个机会修改窗口显示属性.

    CFrame对象窗口一创建引发WM_CREATEWINODW消息导致了下面的调用:


int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
int CFrameWnd::OnCreate(LPCREATESTRUCT lpcs)
int CFrameWnd::OnCreateHelper(LPCREATESTRUCT lpcs, CCreateContext* pContext)
CWnd* CFrameWnd::CreateView(CCreateContext* pContext, UINT nID)
 if (!pView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
  CRect(0,0,0,0), this, nID, pContext))


    CView窗口也产生了.至于状态栏与工具栏窗口的创建就不多说了.
    最后是消息循环.

你可能感兴趣的:(框架,File,null,Class,文档,工具)