初学者分析MFC代码6

作者:liguisen

bloghttp://blog.csdn.net/liguisen/

 

如上篇所说,由于MFC基于Dialog based的工程InitInstance()函数中永远return FALSE,导致我们无法继续往下分析,于是现在来分析一下SDI工程。

       前面和Dialog based的工程类似,先建立一个名为SdiSDI工程。在向导的第三步,把ActiveX Controls的勾去掉;在第四步,也是把所有的勾都去掉,单击Advanced,选择Windows Styles,同样把所有的勾都去掉(从前面对Dialog based工程的分析知道,反正我们最后都是要删掉的)。

       工程建立后,如Dialog based工程,删掉相关代码,尽可能多的加断点,但IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)IMPLEMENT_DYNCREATE(CSdiDoc, CDocument)IMPLEMENT_DYNCREATE(CSdiView, CView)3句不加(涉及动态创建等东西,目前不适合我们这篇文章,可参考深入浅出MFC),然后F5运行,最后的代码及程序运行步骤如下:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

StdAfx.h:

    #include <afxwin.h>        

#include <afxext.h>       

#include <afxdtctl.h>

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

StdAfx.cpp:

#include "stdafx.h"

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

MainFrm.h:

class CMainFrame : public CFrameWnd

{      

protected:

         CMainFrame();

         DECLARE_DYNCREATE(CMainFrame)

public:

         virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

         virtual ~CMainFrame();

};

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

MainFrm.cpp:

#include "stdafx.h"

#include "Sdi.h"

#include "MainFrm.h"

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

CMainFrame::CMainFrame()

{//zuilang:12

}//zuilang:13

CMainFrame::~CMainFrame()

{//zuilang:41

}//zuilang:42

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)

{//zuilang:1419

         if( !CFrameWnd::PreCreateWindow(cs) ) //zuilang:1520

                   return FALSE;

         cs.style = WS_OVERLAPPED | WS_CAPTION | FWS_ADDTOTITLE

                   ; //zuilang:1621

        return TRUE; //zuilang:1722

}//zuilang:1823

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Sdi.h:

#include "resource.h"      

class CSdiApp : public CWinApp

{

public:

         CSdiApp();

         virtual BOOL InitInstance();

};

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Sdi.cpp:

#include "stdafx.h"

#include "Sdi.h"

#include "MainFrm.h"

#include "SdiDoc.h"

#include "SdiView.h"

CSdiApp::CSdiApp()

{//zuilang:2        

}//zuilang:3

 

CSdiApp theApp;//zuilang:1

 

BOOL CSdiApp::InitInstance()

{//zuilang:4

         CSingleDocTemplate* pDocTemplate;

         pDocTemplate = new CSingleDocTemplate(

                  IDR_MAINFRAME,

                  RUNTIME_CLASS(CSdiDoc),

                  RUNTIME_CLASS(CMainFrame),       

                  RUNTIME_CLASS(CSdiView)); //zuilang:5

         AddDocTemplate(pDocTemplate); //zuilang:6

        

         CCommandLineInfo cmdInfo; //zuilang:7

         ParseCommandLine(cmdInfo); //zuilang:8

        

         if (!ProcessShellCommand(cmdInfo)) //zuilang:9

                   return FALSE;

        

         m_pMainWnd->ShowWindow(SW_SHOW); //zuilang:33

         m_pMainWnd->UpdateWindow();//zuilang:34

 

        return TRUE; //zuilang:37

}//zuilang:38

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

SdiDoc.h:

class CSdiDoc : public CDocument

{

protected:

         CSdiDoc();

         DECLARE_DYNCREATE(CSdiDoc)

public:

         virtual BOOL OnNewDocument();

         virtual ~CSdiDoc();

 

};

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

SdiDoc.cpp:

#include "stdafx.h"

#include "Sdi.h"

#include "SdiDoc.h"

 

IMPLEMENT_DYNCREATE(CSdiDoc, CDocument)

 

CSdiDoc::CSdiDoc()

{ //zuilang:10

} //zuilang:11

CSdiDoc::~CSdiDoc()

{//zuilang:43

}//zuilang:44

BOOL CSdiDoc::OnNewDocument()

{ //zuilang:29

         if (!CDocument::OnNewDocument())//zuilang:30

                   return FALSE;    

 

        return TRUE; //zuilang:31

} //zuilang:32

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

SdiView.h:

class CSdiView : public CView

{

protected:

         CSdiView();

         DECLARE_DYNCREATE(CSdiView)

public:

         virtual void OnDraw(CDC* pDC); 

         virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

         virtual ~CSdiView();

};

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

SdiView.cpp:

#include "stdafx.h"

#include "Sdi.h"

#include "SdiDoc.h"

#include "SdiView.h"

 

IMPLEMENT_DYNCREATE(CSdiView, CView)

 

CSdiView::CSdiView()

{ //zuilang:24

} //zuilang:25

CSdiView::~CSdiView()

{//zuilang:39

}//zuilang:40

BOOL CSdiView::PreCreateWindow(CREATESTRUCT& cs)

{ //zuilang:26

         return CView::PreCreateWindow(cs); //zuilang:27

} //zuilang:28

void CSdiView::OnDraw(CDC* pDC)

{//zuilang:35步,此时去掉这一句的断点

}//zuilang:36步,此时去掉这一句的断点

 

大概的流程如下:

构造应用程序类全局对象theApp-》应用程序类初始化InitInstance()-》构造文档CSdiDoc()-》构造主框架CmainFrame()-》准备创建框架窗口CMainFrame::PreCreateWindow-》构造视CSdiView()-》准备创建视窗口CSdiView::PreCreateWindow-》打开新文档CSdiDoc::OnNewDocument()-》显示窗口m_pMainWnd->ShowWindow-》更新窗口m_pMainWnd->UpdateWindow()-》重绘窗口CSdiView::OnDraw-》析构视~CSdiView()-》析构框架~CMainFrame()-》析构文档~CSdiDoc()

 

MFC应用程序详细的启动过程比上面的要复杂n倍!下一篇进行更深入的分析! 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值