版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、TextOut(hDC,200,0,九九乘法表,strlen(九九乘法表); TextOut(hDC,20,20,1*1=1,strlen(1*1=1); TextOut(hDC,20,40,1*2=2 2*2=4,strlen(1*2=2 2*2=4); TextOut(hDC,20,60,1*3=3 2*3=6 3*3=9,strlen(1*3=3 2*3=6 3*3=9); TextOut(hDC,20,80,1*4=4 2*4=8 3*4=12 4*4=16,strlen(1*4=4 2*4=8 3*4=12 4*4=16); TextOut(hDC,20,100,1*5=5 2*5=
2、10 3*5=15 4*5=20 5*5=25,strlen(1*5=5 2*5=10 3*5=15 4*5=20 5*5=25); TextOut(hDC,20,120,1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36,strlen(1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36); TextOut(hDC,20,140,1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49,strlen(1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49);
3、 TextOut(hDC,20,160,1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64,strlen(1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64); TextOut(hDC,20,180,1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81,strlen(1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81); 作业上交方式作业上
4、交方式 你的工程名为 学号_*(*分别用1,2,3等代表第一次作业)例如: 学号为1108320126,则第一次作业的工程名为1108320126_1,则编译链接后会形成子目录1108320126_1 ,其中该目录下会有debug子目录,将debug子目录删除,然后将1108320126_1整个目录压缩成一个文件发到邮箱。MFC程序的运行机制程序的运行机制 SDK程序的运行过程程序的运行过程 进入进入WinMainWinMain后,首先设计窗口类,注册窗口、后,首先设计窗口类,注册窗口、创建窗口、然后显示窗口、更新窗口、最后进创建窗口、然后显示窗口、更新窗口、最后进入消息循环,将消息路由到我们
5、的窗口过程函入消息循环,将消息路由到我们的窗口过程函数中去处理数中去处理 。MFC程序的启动与死亡顺序程序的启动与死亡顺序单文档应用程序单文档应用程序WinGreet中使用到的类中使用到的类文档模板类:文档模板类:直接使直接使用,管理文档、视图用,管理文档、视图和框架和框架文档类:文档类:负责数据负责数据结构与文件操作结构与文件操作应应用用类类框架类框架类:主窗口主窗口视图类:视图类:负责数据负责数据的显示与打印的显示与打印状态栏和工具栏直状态栏和工具栏直接使用接使用MFC程序的启动程序的启动1、创建、创建Applicationobject对象对象theApp程序一开始生产一个程序一开始生产一
6、个( (且只有一个且只有一个) )应用类对象应用类对象 theApptheApp,也即一个也即一个CWinAppCWinApp对象,这个全局对象一产生,便执行其对象,这个全局对象一产生,便执行其构造函数,导致其基类构造函数,导致其基类CWinAppCWinApp类的构造函数被调用。该类的构造函数被调用。该函数定义于函数定义于APPCORE.CPPAPPCORE.CPP第第7575行,因此,行,因此,CWinAppCWinApp之中的之中的成员变量将因为成员变量将因为theApptheApp这个全局对象的诞生而获得配置这个全局对象的诞生而获得配置与初值与初值在在SDKSDK编程时,是通过一个应用
7、程序的实例号来标示一个应用程序编程时,是通过一个应用程序的实例号来标示一个应用程序的。在基于的。在基于MFCMFC应用程序中,是通过产生一个应用类的对象来唯一应用程序中,是通过产生一个应用类的对象来唯一标识我们的整个应用程序标识我们的整个应用程序。MFC程序的启动程序的启动2、WinMain登场登场用用SDK编程序时,程序的入口点是编程序时,程序的入口点是WinMain函数,函数,而在而在MFC程序里我们并没有看到程序里我们并没有看到WinMain函数,函数,原原来她是被隐藏在来她是被隐藏在MFC代码里面了。当代码里面了。当theApp配置完配置完成后,成后,WinMain登场。登场。MFC早
8、已准备好并由链接器直早已准备好并由链接器直接加到应用程序代码中了,原来她在接加到应用程序代码中了,原来她在appmodul.cpp里面。里面。MFC程序的启动程序的启动APPMODUL.CPP摘出来的代码摘出来的代码 _tWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPTSTRlpCmdLine,intnCmdShow)/callshared/exportedWinMainreturnAfxWinMain(hInstance,hPrevInstance,lpCmdLine,nCmdShow);_tWinMain函数的函数的“_t”是为了支
9、持是为了支持Unicode而准备的一个而准备的一个宏宏 MFC程序的启动程序的启动AfxWinMain函数定义于函数定义于WINMAIN.CPP第第21行行intAFXAPIAfxWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPTSTRlpCmdLine,intnCmdShow)intnReturnCode=-1;CWinApp*pApp=AfxGetApp();AfxWinInit(hInstance,hPrevInstance,lpCmdLine,nCmdShow);pApp-InitApplication();pApp-InitIn
10、stance()nReturnCode=pApp-Run();AfxWinTerm();returnnReturnCode;MFC程序的启动程序的启动AfxGetApp()函数是取得函数是取得CWinGreetApp对象指针,故上面函对象指针,故上面函数第数第4至至6行相当于调用:行相当于调用:CWinGreetApp:InitApplication();CWinGreetApp:InitInstance()CWinGreetApp:Run();因而导致调用:因而导致调用:CWinApp:InitApplication();/因为因为CWinGreetApp并没有改写并没有改写InitAppl
11、icationCWinGreetApp:InitInstance()/因为因为CWinGreetApp改写了改写了InitInstanceCWinApp:Run();/因为因为CWinGreetApp并没有改写并没有改写RunMFC程序的启动程序的启动3 3、AfxWinInitAfxWinInitAFXAFX内部初始化操作内部初始化操作AfxWinInitAfxWinInit是继是继CWinAppCWinApp构造函数之后的第一个操作构造函数之后的第一个操作,主要做的是,主要做的是AFXAFX内部初始化操作内部初始化操作4 4、执行、执行CWinApp:InitApplicationCWin
12、App:InitApplication AfxWinInitAfxWinInit之后的操作是之后的操作是pApp-InitApplicationpApp-InitApplication 而而pApppApp指向指向CWinGreetAppCWinGreetApp对象,所以对象,所以相当于调用:相当于调用: CWinGreetApp:InitApplication();CWinGreetApp:InitApplication(); 而而CWinGreetAppCWinGreetApp继承自继承自CWinApp, InitApplicationCWinApp, InitApplication又是又
13、是CWinAppCWinApp的一个虚拟函数,我们并没有改写它的一个虚拟函数,我们并没有改写它( (大大部分情况下不需改写它部分情况下不需改写它) ),所以上述操作相当于调用,所以上述操作相当于调用CWinApp:InitApplication(); MFCCWinApp:InitApplication(); MFC完成内部管理完成内部管理MFC程序的启动程序的启动5、执行、执行CWinApp:InitInstance继继InitApplication函数之后,函数之后,AfxWinMain调用调用pApp-InitInstance。当程序调用:当程序调用:pApp-InitInstance(
14、);相当于调用:相当于调用:CWinGreetApp:InitInstance();而而CWinGreetApp继承自继承自CWinApp,而而InitInstance又是又是CWinApp的一个虚拟函数。由于我们改写了它的一个虚拟函数。由于我们改写了它,所以上述操作就是调用我们自己,所以上述操作就是调用我们自己(CWinGreetApp)的这个的这个InitInstance函数。函数。MFC程序的启动程序的启动6、窗口注册及窗口创建、窗口注册及窗口创建在在CWinGreetApp:InitInstance函数内有函数内有ProcessShellCommand(cmdInfo)这个函数,在这个
15、这个函数,在这个函数内实现函数内实现窗口的注册窗口的注册,窗口的创建窗口的创建。【注意注意】由于框架、视图、工具条和状态条都是窗口,由于框架、视图、工具条和状态条都是窗口,所以在这个过程中都要创建这些窗口。所以在这个过程中都要创建这些窗口。MFC程序的启动程序的启动剖析剖析ProcessShellCommand(cmdInfo)函数函数(1)DOCTEMPL.CPP的的264行行CFrameWnd*pFrame=(CFrameWnd*)m_pFrameClass-CreateObject();在这个函数内会通过在这个函数内会通过new算子创建框架类算子创建框架类CMainFrame。先调用基类
16、先调用基类CFrameWnd的构造函数,再调用的构造函数,再调用CMainFrame的构的构造函数,接着调用状态条类造函数,接着调用状态条类CStatusBar的构造函数和工具条类的构造函数和工具条类CToolBar的构造函数。的构造函数。MFC程序的启动程序的启动DOCTEMPL.CPP的的277行行(2)pFrame-LoadFrame(m_nIDResource,WS_OVERLAPPEDWINDOW|FWS_ADDTOTITLE,NULL,&context)在这个函数内完成窗口类的注册,产生主窗口并加挂菜单等诸元在这个函数内完成窗口类的注册,产生主窗口并加挂菜单等诸元素,并指定
17、窗口标题、文件标题、文件扩展名等。素,并指定窗口标题、文件标题、文件扩展名等。该函数内部将依次调用该函数内部将依次调用AfxDeferRegisterClass,Create,后者,后者将调用将调用CreateWindowEx,于是触发,于是触发WM_CREATE消息。消息。MFC程序的启动程序的启动a)AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG)它是个宏,实际调用它是个宏,实际调用AfxEndDeferRegisterClass函数。函数。#defineAfxDeferRegisterClass(fClass)AfxEndDeferRegiste
18、rClass(fClass)定义于定义于AFXIMPL.H中的宏中的宏这个函数进一步调用这个函数进一步调用AfxRegisterClass(pWndCls);来完成来完成窗口窗口类的注册类的注册。在在MFC中,预先给我们定义好了缺省的窗口类,我们只需调用中,预先给我们定义好了缺省的窗口类,我们只需调用AfxEndDeferRegisterClass去注册就可以。它会根据我们的应去注册就可以。它会根据我们的应用程序选择不同的窗口去注册。用程序选择不同的窗口去注册。MFC程序的启动程序的启动b)在在Create中会调用中会调用CreateWindowEx,于是触发于是触发WM_CREATE消息。消
19、息。由于在由于在CMainFrame中拦截了中拦截了WM_CREATE消息消息(利用(利用ON_WM_CREATE宏),所以宏),所以WM_CREATE消息产生之消息产生之际会调用际会调用CMainFrame类的类的OnCreate函数。在此函数内先调用函数。在此函数内先调用基类基类CFrameWnd的的OnCreate函数,然后为主窗口挂上工具条函数,然后为主窗口挂上工具条和状态条。和状态条。而在而在CFrameWnd:OnCreate中会创建视图(中会创建视图(CView)窗口)窗口MFC程序的启动程序的启动7、窗口显示与更新、窗口显示与更新窗口创建完成后,窗口创建完成后,回到回到Init
20、Instance,执行执行ShowWindow显示窗口,显示窗口,执行执行UpdateWindow发送发送WM_PAINT更新窗口。更新窗口。8、消息循环、消息循环InitInstance结束,回到结束,回到AfxWinMain,执行,执行Run,进入消息循环。,进入消息循环。MFC程序的启动程序的启动intAFXAPIAfxWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPTSTRlpCmdLine,intnCmdShow)intnReturnCode=-1;CWinApp*pApp=AfxGetApp();AfxWinInit(hIns
21、tance,hPrevInstance,lpCmdLine,nCmdShow);pApp-InitApplication();pApp-InitInstance()nReturnCode=pApp-Run();AfxWinTerm();returnnReturnCode;MFC程序的运行程序的运行在在Run()中会调用()中会调用PumpMessageBOOLCWinThread:PumpMessage()if(!:GetMessage(&m_msgCur,NULL,NULL,NULL)returnFALSE;MFC程序的运行程序的运行/processthismessageif(m_m
22、sgCur.message!=WM_KICKIDLE&!PreTranslateMessage(&m_msgCur):TranslateMessage(&m_msgCur);:DispatchMessage(&m_msgCur);returnTRUE;MFC程序的运行程序的运行在在SDK程序中,消息是通过窗口函程序中,消息是通过窗口函数来处理,而现在窗口函数在哪里、数来处理,而现在窗口函数在哪里、又如何送到窗口函数手中呢?又如何送到窗口函数手中呢?MFC程序的运行程序的运行在执行在执行AfxEndDeferRegisterClass函数,注册窗口类时,可函数,注
23、册窗口类时,可以看到窗口过程函数以看到窗口过程函数wndcls.lpfnWndProc=DefWindowProc;虽然窗口过程函数被指定为虽然窗口过程函数被指定为DefWindowProc,但事实上并不是,但事实上并不是所有的消息都是交给缺省的窗口过程处理,而是采用转换,即一所有的消息都是交给缺省的窗口过程处理,而是采用转换,即一种种消息映射机制,消息映射机制,通过消息响应函数来处理消息。通过消息响应函数来处理消息。MFC程序的运行程序的运行消息映射机制消息映射机制-把消息与处理函数连接在一起把消息与处理函数连接在一起提供更方便的程序接口,让程序员可以很方便建立消息和处理程提供更方便的程序接
24、口,让程序员可以很方便建立消息和处理程序的对应关系。序的对应关系。这个方便的接口是通过两组宏来实现的。这个方便的接口是通过两组宏来实现的。首先在类声明(首先在类声明(.h文件)中文件)中结合结合DECLARE_MESSAGE_MAP()宏给出处理函数,宏给出处理函数,再在相应的再在相应的.CPP文件中文件中(当然不能在函数之内当然不能在函数之内)使用使用BEBIN_MESSAGE_MAP()和和END_MESSAGE_MAP()宏把相应宏把相应的消息加入去的消息加入去MFC程序的运行程序的运行消息的种类与消息与函数间的对应关系消息的种类与消息与函数间的对应关系MFC程序的运行程序的运行标准标准
25、Windows消息(消息(WM_XXX)的对应规则的对应规则宏名称对应关系消息处理函数(名称已由系统默认)ON_WM_CHARWM_CHAROnCharON_WM_CREATEWM_CREATEOnCreateON_WM_CLOSEWM_CLOSEOnCloseON_WM_LBUTTONDOWM WM_LBUTTONDOMWOnLButtonDownON_WM_PAINTWM_PAINTOnPaintMFC程序的运行程序的运行命令消息(命令消息(WM_COMMAND)的一般性对应规则的一般性对应规则ON_COMMAND(,)如如ON_COMMAND(IDM_ABOUT,OnAbout)ON_C
26、OMMAND(IDM_FILENEW,OnFileNew)ON_COMMAND(IDM_FILEOPEN,OnFileOpen)MFC程序的运行程序的运行通知(通知(Notification)消息(由控件产生)的对)消息(由控件产生)的对应机制分为好几种(因为控件本就分为好几种)应机制分为好几种(因为控件本就分为好几种)控件宏名称消息处理函数ButtonON_BN_CLICKED (,) memberFxnCombBoxON_CBN_DLICKED (,)memberFxnEditON_EN_SETFOCUS (,) memberFxnMFC程序的运行程序的运行为什么经过这样的宏之后,消息就会
27、自动流往指为什么经过这样的宏之后,消息就会自动流往指定的函数去呢?定的函数去呢?谜底在于谜底在于MessageMap的结构设计的结构设计MFC程序的启动程序的启动视图类和框架类中都有个虚函数视图类和框架类中都有个虚函数PreCreateWindow,他们的目的?,他们的目的?PreCreateWindow(CREATESTRUCT&cs)MFC程序的启动程序的启动PreCreateWindow函数的目的函数的目的就是让我们在产生窗口前有机会去修改窗口的外观。比如生成这就是让我们在产生窗口前有机会去修改窗口的外观。比如生成这个窗口,不想要最大化框。我们看到窗口的创建都是在个窗口,不想要最
28、大化框。我们看到窗口的创建都是在MFC的底的底层的基类中完成的,对于我们自己的类来说,没有调用层的基类中完成的,对于我们自己的类来说,没有调用CreateWindowEx的函数去创建窗口,因此它就设计了这个参数的函数去创建窗口,因此它就设计了这个参数让我们有机会去修改窗口的外观,而且定义为引用,当我们修改让我们有机会去修改窗口的外观,而且定义为引用,当我们修改结构体的成员时,在基类中会有体现的。这个函数在结构体的成员时,在基类中会有体现的。这个函数在CreateWindowEX前被调用。前被调用。CreateWindowEX函数所带的参函数所带的参数就是数就是CREATESTRUCT的结构体中
29、的成员,因此就会创建一个的结构体中的成员,因此就会创建一个符合我们要求的窗口。符合我们要求的窗口。MFC程序的来龙去脉程序的来龙去脉程序的诞生程序的诞生n应用对象产生,内存于是获得配置应用对象产生,内存于是获得配置nAfxWinMain执行执行AfxWinInt,进行初始化设置,进行初始化设置nAfxWinMain执行执行InitApplication,是个虚函数,通常不改写它,是个虚函数,通常不改写它nAfxWinMain执行执行InitInstance,是虚函数,我们改写它,是虚函数,我们改写它n在在InitInstance中执行中执行ProcessShellCommand(cmdInfo)实现窗实现窗口的注册,创建。口的注册,创建。n回到回到InitInstance中继续执行中继续执行ShowWindow,显示窗口显示窗口n执行执行UpdateWindow,发出,发出WM_PAINT消息。消息。n回到回到AfxWinMain,执行,执行Run,进入消息循环。,进入消息循环。MFC程序的运行过程程序的运行过程 MFC程序的来龙去脉程序的来龙去脉程序开始运行程序开始运行n程序获得程序获得WM_PAINT消息(消息(Run()中的()中的:PeekMessage)nWM_PAI
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2017-2018学年人教版英语必修一教案Unit5NelsonMandelaamodernhero
- 三年级下册生命生态安全教案教学提纲
- 大班食品安全教育教案40篇
- 新闻媒体行业报告
- 2024年经营权承包合同范本
- 2024年福州驾驶员货运从业资格证考试题
- 2024年呼和浩特道路客运输从业资格证仿真考试题库
- 2024年天津驾驶员客运资格证模拟考试题及答案
- 2024年丽江客运驾驶员从业资格考试系统
- 2024年简单的产品加工合同范本
- 除尘器拆除施工方案
- 环氧树脂罩光漆性能特点使用范围及施工方案
- 新外研版八年级上册英语重点短语与句子汇总
- 黄梅戏《对花》音乐教案
- 职工代表大会及职代会联席会议制度
- 共青团团歌简谱
- 食管癌手术配合
- 设备安装调试记录表格
- Brother-TC-S2A机器操作资料课件
- 提高急危重患者转运途中安全率(共40页).ppt
- 二十个大型新建铜矿的生产成本
评论
0/150
提交评论