手写简单的MFC框架,分析MFC的运行流程
2014-08-17 08:43
260 查看
今天主要对着杨力翔老师的视频教程,仔细学习了MFC的处理流程。
以下是自己写的代码,分析了MFC的流程,这个比较简单每个人都可以实现。
注意事项:
①我用的是vs2010,新建一个win32应用程序。
②在项目/属性/配置属性/常规/MFC的使用选择 在共享DLL中使用MFC。
以下将按照win32 api编程的消息流程来梳理一下MFC:
![](https://img-blog.csdn.net/20140817081148128?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VwZXJzb25pY28=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
①程序首先进入全局对象,CMyApp myApp,调用构造函数初始化对象。
②然后程序进入AfxWinMain函数,次函数是编辑器自己加载的。pApp指向当前当前创建的对象也就是myApp,AfxGetApp()作用就是获得当前对象。AfxWinInit初始化一些参数:主要有myApp中的m_hInstance,m_hPrevInstance,m_lpCmdLine,m_nCmdShow.
③调用当前对象的InitApplication,由于InitApplication是虚函数,并且我们没有改写它,所以调用的是CWinApp::InitApplication。主要是Document Template。
④然后进入InitInstance,我们改写之后调用的是CMyApp::InitInstance.进入InitInstance函数内部,我们在堆里面创建一个CMainWindow的对象。
⑤创建CMainWindow对象我们要调用CMainWindow( )这个构造函数。
⑥进入构造函数Create用来注册窗口类和创建窗口。
⑦然后接着ShowWindow显示窗口。
⑧UpdateWindow更新窗口。返回值然后退出构造函数
⑨接着进入Run,Run是用来驱动消息循环的。也就是获得消息,然后分配转发消息。
⑩通过message map中的消息宏找到对应的消息处理函数。
⑪然后进入消息处理函数,这里我们一般重写该函数,如果不重写就往祖先里寻找该函数。
以下是自己写的代码,分析了MFC的流程,这个比较简单每个人都可以实现。
注意事项:
①我用的是vs2010,新建一个win32应用程序。
②在项目/属性/配置属性/常规/MFC的使用选择 在共享DLL中使用MFC。
//Hello.h class CMyApp : public CWinApp { public: virtual BOOL InitInstance(); }; class CMainWindow : public CFrameWnd { public: CMainWindow(); protected: afx_msg void OnPaint(); DECLARE_MESSAGE_MAP() };
//Hello.cpp #include <afxwin.h> #include "Hello.h" CMyApp myApp; BOOL CMyApp::InitInstance() { m_pMainWnd = new CMainWindow(); m_pMainWnd->ShowWindow(m_nCmdShow); m_pMainWnd->UpdateWindow(); return TRUE; } BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd) ON_WM_PAINT() END_MESSAGE_MAP() CMainWindow::CMainWindow() { Create(NULL,_T("L")); } void CMainWindow::OnPaint() { CRect rect; GetClientRect(&rect); CPaintDC dc(this); CFont font; font.CreatePointFont(300,_T("宋体")); dc.SelectObject(&font); dc.DrawText(_T("I Love Asuna"),-1,&rect,DT_CENTER | DT_SINGLELINE | DT_VCENTER); }
以下将按照win32 api编程的消息流程来梳理一下MFC:
①程序首先进入全局对象,CMyApp myApp,调用构造函数初始化对象。
②然后程序进入AfxWinMain函数,次函数是编辑器自己加载的。pApp指向当前当前创建的对象也就是myApp,AfxGetApp()作用就是获得当前对象。AfxWinInit初始化一些参数:主要有myApp中的m_hInstance,m_hPrevInstance,m_lpCmdLine,m_nCmdShow.
③调用当前对象的InitApplication,由于InitApplication是虚函数,并且我们没有改写它,所以调用的是CWinApp::InitApplication。主要是Document Template。
④然后进入InitInstance,我们改写之后调用的是CMyApp::InitInstance.进入InitInstance函数内部,我们在堆里面创建一个CMainWindow的对象。
⑤创建CMainWindow对象我们要调用CMainWindow( )这个构造函数。
⑥进入构造函数Create用来注册窗口类和创建窗口。
⑦然后接着ShowWindow显示窗口。
⑧UpdateWindow更新窗口。返回值然后退出构造函数
⑨接着进入Run,Run是用来驱动消息循环的。也就是获得消息,然后分配转发消息。
⑩通过message map中的消息宏找到对应的消息处理函数。
⑪然后进入消息处理函数,这里我们一般重写该函数,如果不重写就往祖先里寻找该函数。
相关文章推荐
- Play之Scala-Web项目运行流程-简单分析(3)
- 分析Python的Django框架的运行方式及处理流程
- Play之Scala-Web项目运行流程-简单分析(1)
- aidl涉及的Binder框架流程简单分析
- 分析Python的Django框架的运行方式及处理流程
- MFC单文档框架分析及执行流程
- 5.Spark Streaming流计算框架的运行流程源码分析
- Play之Scala-Web项目运行流程-简单分析(2)
- mfc,示例 ctrlbars 程序运行流程分析
- [笔记]架构探险-从零开始写JavaWeb框架-2.1. 之使框架具有aop特性-aop框架加载与切面运行流程分析
- 5.Spark Streaming流计算框架的运行流程源码分析2
- Play之Scala-Web项目运行流程-简单分析(1)
- MVC封装框架 第一步 (分析mvc框架运行流程)
- Play之Scala-Web项目运行流程-简单分析(3)
- Play之Scala-Web项目运行流程-简单分析(2)
- Play之Scala-Web项目运行流程-简单分析(2)
- Play之Scala-Web项目运行流程-简单分析(1)
- 分析Python的Django框架的运行方式及处理流程
- MFC简单框架启动流程(CWinApp,CFrameWnd)
- MFC框架中的设计模式分析