网站设置不能通过链接访问,做网站怎样才能接单,如何做好营销,微信公众平台直接上传wordpress一 MFC程序执行过程剖析 1#xff09;我们知道在WIN32API程序当中#xff0c;程序的入口为WinMain函数#xff0c;在这个函数当中我们完成注册窗口类#xff0c;创建窗口#xff0c;进入消息循环#xff0c;最后由操作系统根据发送到程序窗口的消息调用程序的窗口函数。而… 一 MFC程序执行过程剖析 1我们知道在WIN32API程序当中程序的入口为WinMain函数在这个函数当中我们完成注册窗口类创建窗口进入消息循环最后由操作系统根据发送到程序窗口的消息调用程序的窗口函数。而在MFC程序当中我们不在能找到类似WinMain这样的程序入口取而代之的是一系列派生类的声明和定义以及一个冲CWinApp类派生而来的类的全局对象。CWinApp类被称之为应用程序对象在一个MFC程序当中只允许有一个应用程序对象。由于CWinApp的派生对象是全局的因此这个对象的构造函数会在所有的其他代码运行之前被调用而由于CWinApp类当中包含了HWND、HINSTANCE等句柄的存在其构造函数就执行了对这些成员数据的初始化操作这里的所谓初始化仅仅是把所有的句柄对象赋值为NULL。 2在调用完CWinApp的构造函数以后由连接器向程序内自动链接的AfxWinMain函数将被调用而这个函数可以被看作MFC程序的入口函数。在这个函数当中调用全局AfxGetApp()函数获得应用程序对象这时将调用AfxInit全局函数这个函数的功能是使用操作系统传递给AfxWinMain函数的参数初始化应用程序对象当中的相关句柄数据成员。 3之后AfxWinMain函数调用CWinApp::InitApplication成员函数这个成员函数用来初始化应用程序对象当中的关于文档部分的内容。 4随后调用CWinApp::InitInstance成员函数在这个成员函数当中使用new操作在堆上声明一个框架窗口对象由此导致框架窗口对象的构造函数被调用在框架窗口构造函数当中调用Create函数来创建窗口而调用的Create函数一般将WNDCLASS参数设置成NULL这样就由MFC内部调用PreCreateWindow函数在这个函数当中由MFC注册几个默认的WNDCLASS供框架窗口的Create使用。这时程序控制权交还给CWinApp::InitInstance成员函数内部由这个函数调用CWnd::ShowWindow显示窗口并且调用CWnd::UpdateWindow向窗口发送WM_PAINT消息。调用完CWinApp::InitInstance成员函数后由AfxWinMain函数调用CWinApp::Run成员函数并由这个函数来创建和处理消息循环并且在没有消息的时候处理OnIdle空闲处理。至此整个程序的创建过程完成。 5在程序的运行过程当中由操作系统源源不断的发送消息给应用程序并且由CWinApp::Run当中的消息循环处理并且分发给相关的窗口对象的DefWindowProc成员函数并由这个成员函数查询窗口对象的消息映射表如果查到对应项则由登记在消息映射表当中的类成员函数处理否则则按照Message Route当中的顺序象父层类发送。 6在消息运行结束用户按下关闭按钮后操作系统向程序发送WM_CLOSE消息默认状况下程序调用DestoryWindow并且发送WM_DESTORY消息应用程序接受到这个消息以后的默认操作是调用PostQuitMessage函数由这个函数发送WM_QUIT消息。当程序对象接受到WM_QUIT消息后消息循环结束由AfxWinMain函数调用AfxTerm函数清理程序使用过的资源并且结束整个程序。 小结以上的所有描述涵盖了一个程序从开始、运行到结束的所有过程。 相信大家有点晕点了吧实际编程中没有必要深刻理解这么多这些大都是由MFC内部自动帮我们完成的。实际MFC编程过程中其实懂得MFC程序中各个函数的执行流程即可。有时候过于追究MFC细节会白白浪费我们的精力应该将主要精力放在使用MFC解决实际问题上。 二 VC6中SDI程序的执行流程 下面以VC6中的sdi工程为例通过给每个函数前设置断点后调式执行可以看出MFC的SDI的执行流程。记录如下希望对MFC执行有疑惑的人有帮助。 1CSdiApp theApp; //sdi.cpp 2CSdiApp::CSdiApp() //sdi.cpp 3BOOL CSdiApp::InitInstance() //sdi.cpp 4CSdiDoc::CSdiDoc() //sdiDoc.cpp 5CMainFrame::CMainFrame() //MainFrm.cpp 6BOOL CMainFrame::PreCreateWindow(CREATESTRUCT cs) //MainFrm.cpp 7int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) //MainFrm.cpp 8CSdiView::CSdiView() //sdiView.cpp 9BOOL CSdiView::PreCreateWindow(CREATESTRUCT cs) //sdiView.cpp 10BOOL CSdiDoc::OnNewDocument() //sdiDoc.cpp 11) void CSdiView::OnDraw(CDC* pDC) //sdiView.cpp // ---------------- 关闭窗口后------------------------------------- 12) CSdiView::~CSdiView() 13) CMainFrame::~CMainFrame() 14) CSdiDoc::~CSdiDoc()