windows的运行机制

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MFC程序的启动 程序的启动
AFX内部初始化操作 3、AfxWinInit——AFX内部初始化操作 AfxWinInit AFX AfxWinInit是继CWinApp构造函数之后的第一个操作 AfxWinInit是继CWinApp构造函数之后的第一个操作 是继CWinApp ,主要做的是AFX内部初始化操作 主要做的是AFX内部初始化操作 AFX 4、执行CWinApp::InitApplication 执行CWinApp::InitApplication AfxWinInit之后的操作是pApp->InitApplication AfxWinInit之后的操作是pApp之后的操作是pApp 相当于调用: 而pApp指向CWinGreetApp对象,所以 相当于调用: pApp指向CWinGreetApp对象, 指向CWinGreetApp对象 CWinGreetApp::InitApplication(); 而CWinGreetApp继承自CWinApp, InitApplication CWinGreetApp继承自CWinApp, 继承自 又是CWinApp的一个虚拟函数,我们并没有改写它( 又是CWinApp的一个虚拟函数,我们并没有改写它(大 CWinApp的一个虚拟函数 部分情况下不需改写它) 部分情况下不需改写它),所以上述操作相当于调用 MFC完成内部管理 CWinApp::InitApplication(); MFC完成内部管理
MFC程序的启动 程序的启动 剖析ProcessShellCommand(cmdInfo) 函数 剖析
(1) DOCTEMPL.CPP的264行 ) 的 行
CFrameWnd* pFrame = (CFrameWnd*)m_pFrameClass->CreateObject();
在这个函数内会通过new算子创建框架类 算子创建框架类CMainFrame。 在这个函数内会通过 算子创建框架类 。 先调用基类CFrameWnd的构造函数,再调用CMainFrame的构 的构造函数,再调用 先调用基类 的构造函数 的构 造函数,接着调用状态条类 造函数,接着调用状态条类CStatusBar的构造函数和工具条类 的构造函数和工具条类 CToolBar的构造函数。 的构造函数。 的构造函数
SDK程序的运行过程 程序的运行过程
进入WinMain后 首先设计窗口类,注册窗口、 进入WinMain后,首先设计窗口类,注册窗口、 WinMain 创建窗口、然后显示窗口、更新窗口、 创建窗口、然后显示窗口、更新窗口、最后进 入消息循环, 入消息循环,将消息路由到我们的窗口过程函 数中去处理 。
MFC程序的启动与死亡顺序 程序的启动与死亡顺序
文档类: 文档类:负责数据 结构与文件操作
应 用
文档模板类: 文档模板类:直接使
框架类:主窗口 框架类 主窗口
状态栏和工具栏直

用,管理文档、视图 管理文档、 和框架 接使用
视图类: 视图类:负责数据 的显示与打印 单文档应用程序WinGreet中使用到的类 中使用到的类 单文档应用程序
这个函数进一步调用AfxRegisterClass(pWndCls);来完成窗口 来完成窗口 这个函数进一步调用 来完成 类的注册。 类的注册。 在MFC中,预先给我们定义好了缺省的窗口类,我们只需调用 中 预先给我们定义好了缺省的窗口类, AfxEndDeferRegisterClass去注册就可以。它会根据我们的应 去注册就可以。 去注册就可以 用程序选择不同的窗口去注册。 用程序选择不同的窗口去注册。
MFC程序的启动 程序的启动
b) 在Create中会调用 中会调用CreateWindowEx, 中会调用 , 于是触发WM_CREATE消息。 消息。 于是触发 消息 由于在CMainFrame中拦截了 中拦截了WM_CREATE消息 由于在 中拦截了 消息 所以WM_CREATE消息产生之 (利用ON_WM_CREATE宏),所以 利用 宏),所以 消息产生之 际会调用CMainFrame类的 际会调用 类的OnCreate函数。在此函数内先调用 函数。 类的 函数 基类CFrameWnd的OnCreate函数,然后为主窗口挂上工具条 的 函数, 基类 函数 和状态条。 和状态条。 而在CFrameWnd::OnCreate中会创建视图(CView)窗口 中会创建视图( 而在 中会创建视图 )
MFC程序的启动 程序的启动
DOCTEMPL.CPP的277行 的 行 (2)pFrame->LoadFrame(m_nIDResource, ) WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL, &context)) 在这个函数内完成窗口类的注册,产生主窗口并加挂菜单等诸元 在这个函数内完成窗口类的注册, 素,并指定窗口标题、文件标题、文件扩展名等。 并指定窗口标题、文件标题、文件扩展名等。 该函数内部将依次调用AfxDeferRegisterClass,Create,后者 , 该函数内部将依次调用 , 将调用CreateWindowEx,于是触发WM_CREATE消息。 将调用 ,于是触发 消息。 消息
MFC程序的启动 程序的启动
5、执行CWinApp::InitInstance 、执行 函数之后, 继InitApplication函数之后, 函数之后 AfxWinMain调用 调用pApp->InitInstance。 调用 。 当程序调用: 当程序调用:pApp->InitInstance(); 相当于调用: 相当于调用:CWinGreetApp::InitInstance(); 而 CWinGreetApp 继 承 自 CWinApp, 而 InitInstance 又是CWinApp的一个虚拟函数 。 由于我们改写了它 的一个虚拟函数。 又是 的一个虚拟函数 所以上述操作就是调用我们自己(CWinGreetApp) , 所以上述操作就是调用我们自己 的这个InitInstance函数。 函数。 的这个 函数
SDK编程时, 编程时 在SDK编程时,是通过一个应用程序的实例号来标示一个应用程序 的。在基于MFC应用程序中,是通过产生一个应用类的对象来唯一 在基于MFC应用程序中, MFC应用程序中 标识我们的整个应用程序。 标识我们的整个应用程序。
MFC程序的启动 程序的启动
2、WinMain登场 、 登场 编程序时, 函数, 用SDK编程序时,程序的入口点是 编程序时 程序的入口点是WinMain函数, 函数 而在MFC程序里我们并没有看到 程序里我们并没有看到WinMain函数, 原 函数, 而在 程序里我们并没有看到 函数 来她是被隐藏在MFC代码里面了。当theApp配置完 代码里面了。 来她是被隐藏在 代码里面了 配置完 成后, 登场。 成后,WinMain登场。MFC早已准备好并由链接器直 登场 早已准备好并由链接器直 接加到应用程序代码中了,原来她在appmodul.cpp 接加到应用程序代码中了,原来她在 里面。 里面。
MFC程序的启动 程序的启动
AfxWinMainLeabharlann Baidu数定义于 函数定义于WINMAIN.CPP第21行 函数定义于 第 行
int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrev
Instance, LPTSTR lpCmdLine, int nCmdShow)
MFC程序的启动 程序的启动
6、窗口注册及窗口创建 在CWinGreetApp::InitInstance函数内有 函数内有 ProcessShellCommand(cmdInfo)这个函数,在这个 这个函数, 这个函数 函数内实现窗口的注册 窗口的创建。 窗口的注册, 函数内实现窗口的注册,窗口的创建。 注意】由于框架、视图、工具条和状态条都是窗口, 【注意】由于框架、视图、工具条和状态条都是窗口, 所以在这个过程中都要创建这些窗口。 所以在这个过程中都要创建这些窗口。
MFC程序的运行机制 程序的运行机制
上机时间
周五下午第二大节
第4周 第5周 ~第9周 机房3A,3B 机房 3C,3D
公共邮箱
mfc_a210@163.com 密码 njustmfc_c104
作业上交方式
假设你的工程名为test, 则编译链接后会形成子目录test, 其中该目录下会有debug子目录, 将debug子目录删除,然后将test整 个目录压缩成一个文件发到邮箱。
MFC程序的启动 程序的启动
APPMODUL.CPP摘出来的代码 摘出来的代码
_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevIns tance, LPTSTR lpCmdLine, int nCmdShow) { // call shared/exported WinMain return AfxWinMain(hInstance, hPrevInstance, lpCmd Line, nCmdShow); } _tWinMain函数的“_t”是为了支持 函数的“ 是为了支持 是为了支持Unicode而准备的一个 函数的 而准备的一个 宏
{ int nReturnCode = -1; CWinApp* pApp = AfxGetApp(); AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCm dShow); pApp->InitApplication(); pApp->InitInstance() nReturnCode = pApp->Run(); AfxWinTerm(); return nReturnCode; }
MFC程序的启动 程序的启动
a)AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG)
它是个宏,实际调用 函数。 它是个宏,实际调用AfxEndDeferRegisterClass函数。 函数 #define AfxDeferRegisterClass(fClass) AfxEndDeferRegiste rClass(fClass) 定义于AFXIMPL.H中的宏 中的宏 定义于
MFC程序的启动 程序的启动
AfxGetApp()函数是取得 函数是取得CWinGreetApp对象指针,故上面函 对象指针, 函数是取得 对象指针 数第4至 行相当于调用 行相当于调用: 数第 至6行相当于调用: CWinGreetApp::InitApplication(); CWinGreetApp::InitInstance() CWinGreetApp::Run(); 因而导致调用: 因而导致调用: CWinApp::InitApplication(); //因为 CWinGreetApp 并没有改写 InitApplication 因为 CWinGreetApp::InitInstance() //因为 CWinGreetApp 改写了 InitInstance 因为 CWinApp::Run(); //因为 CWinGreetApp 并没有改写 Run 因为
MFC程序的启动 程序的启动
1、创建Application object对象 theApp 、创建 对象 程序一开始生产一个(且只有一个) theApp, 程序一开始生产一个(且只有一个)应用类对象 theApp, 也即一个CWinApp对象,这个全局对象一产生, 也即一个CWinApp对象,这个全局对象一产生,便执行其 CWinApp对象 构造函数,导致其基类CWinApp类的构造函数被调用。 构造函数,导致其基类CWinApp类的构造函数被调用。该 CWinApp类的构造函数被调用 函数定义于APPCORE.CPP第75行 因此,CWinApp之中的 函数定义于APPCORE.CPP第75行,因此,CWinApp之中的 APPCORE.CPP 成员变量将因为theApp这个全局对象的诞生而获得配置 成员变量将因为theApp这个全局对象的诞生而获得配置 theApp 与初值
相关文档
最新文档