MFC初窥(MFC运行机制-孙鑫C++第三讲笔记整理).docx_第1页
MFC初窥(MFC运行机制-孙鑫C++第三讲笔记整理).docx_第2页
MFC初窥(MFC运行机制-孙鑫C++第三讲笔记整理).docx_第3页
MFC初窥(MFC运行机制-孙鑫C++第三讲笔记整理).docx_第4页
MFC初窥(MFC运行机制-孙鑫C++第三讲笔记整理).docx_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

有了一定的Windows32编程知识,就能学习MFC了。在学习MFC之前,一定要弄明白Windows32编程中的消息循环是怎么回事。MFC实际上就是对Windows API函数的封装。在Windows程序设计编程中,创建一个窗口要经历下面四个过程(如有不懂,请看博客 win32初窥)1设计一个窗口类;2注册窗口类;3创建窗口;4显示及更新窗口。同样,MFC中也是一样的。只是封装了而已,很多人认为MFC很难学,看着书本能编程序,但是却编写不了自己的程序,为什么呢?因为还没有理解MFC的原理的机制。市场上有很多有关VC+的书本,但是很少有将MFC原理讲得比较透彻的,引用孙鑫老师的话。同样的,WinMain也是入口函数,具体的过程,请看孙鑫视频20讲之第三讲其中,孙鑫老师开始提出的一个问题是:在全局变量中,定义一个子类对象。htmlview plaincopy1. #include2. #include3. usingnamespacestd;4. 5. classPerson6. 7. public:8. Person*p;9. Person()10. 11. p=this;/保存this指针12. 13. virtualvoidsay()14. 15. coutPersonssay()endl;16. 17. 18. ;19. 20. classStudent:publicPerson21. 22. public:23. 24. Student()25. 26. 27. 28. voidsay()29. 30. coutStudentssay()say();/这里将调用子类的方法41. return0;42. 什么都不用做,直接用向导生成一个MFC窗口。下面是结构图,有五个类是这样命名的,开头的C表示Class ,C+工程名+(App,Doc,View.)其中CMainFrame表示一个窗口(主窗体,包括标题栏,菜单.),XXApp表示运用程序,XXDOC表示文档类(加载数据,实现数据的存储与操作分离),XXView也表示一个窗口(相当于Windows的客户区)下面看看MFC中类的主要继承关系:由于继承树太大,这里只罗列了CWnd的继承关系API中CreateWindowEx和CreateWindow几乎是一样的,Ex表示扩展,多了一个参数下面用API模拟CWndjust模拟htmlview plaincopy1. /下面是模仿封装API函数2. 3. classCWnd4. 5. public:6. BOOLCreateEX(7. DWORDdwExStyle,/extendedwindowstyle8. LPCTSTRlpClassName,/registeredclassname9. LPCTSTRlpWindowName,/windowname10. DWORDdwStyle,/windowstyle11. intx,/horizontalpositionofwindow12. inty,/verticalpositionofwindow13. intnWidth,/windowwidth14. intnHeight,/windowheight15. HWNDhWndParent,/handletoparentorownerwindow16. HMENUhMenu,/menuhandleorchildidentifier17. HINSTANCEhInstance,/handletoapplicationinstance18. LPVOIDlpParam/window-creationdata19. );20. 21. BOOLShowWindow(intnCmdShow);22. 23. BOOLUpdateWindow();24. 25. public:26. HWNDm_hWnd;27. ;28. 29. BOOLCWnd:CreateEx(30. DWORDdwExStyle,/extendedwindowstyle31. LPCTSTRlpClassName,/registeredclassname32. LPCTSTRlpWindowName,/windowname33. DWORDdwStyle,/windowstyle34. intx,/horizontalpositionofwindow35. inty,/verticalpositionofwindow36. intnWidth,/windowwidth37. intnHeight,/windowheight38. HWNDhWndParent,/handletoparentorownerwindow39. HMENUhMenu,/menuhandleorchildidentifier40. HINSTANCEhInstance,/handletoapplicationinstance41. LPVOIDlpParam/window-creationdata42. );43. 44. m_hWnd=:CreateWindowEx(dwExstyle,lClassName,lpWindowName,dwStyle,x,y,nWidth,nHeight,hWndParent,45. hMenu,hInstance,lParam);46. 47. if(m_hWnd!=NULL)48. 49. returnTRUE;50. else51. returnFALSE;52. 53. 54. BOOLCWnd:ShowWindow(intnCmdShow)55. 56. return:ShowWindow(m_hWnd,nCmdShow);/调用的是SDK全局函数,加个:说明是全局的57. 58. 59. BOOLCWnd:UpdateWindow()60. 61. return:UpdateWindow(m_hWnd);62. 63. 64. intWINAPIWinMain(65. HINSTANCEhInstance,/handletocurrentinstance66. HINSTANCEhPrevInstance,/handletopreviousinstance67. LPSTRlpCmdLine,/commandline68. intnCmdShow/showstate69. )70. 71. WNDCLASSwndclass;72. 73. wndclass.cbClsExtra=0;74. wndclass.cbWndExtra=0;75. wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);76. wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);77. wndclass.hIcon=LoadIcon(NULL,IDI_ERROR);78. wndclass.hInstance=hInstance;79. .80. 81. CWndcwnd;82. cwnd.CreateEx(dwExstyle,.,.);83. 84. cwnd.ShowWindow(nCmdShow);85. cwnd.UpdateWindow();86. 87. while(GetMessage(&msg,NULL,0,0)88. 89. TranslateMessage(&msg);90. DispatchMessage(&msg);91. 92. 93. .94. 下面是重头戏(引用了某位仁兄的,太详细了)重点:MFC运行机制提示:对于不想理解内部运行过程的,可以不看这一章,可以看了后面的界面设计再回头来看这一章,可能感觉更深刻。这一次课和上一次的课的重点就是MFC的窗口类创建过程,而要反复说明的就是:MFC的程序和C语言的程序,从执行原理上说,是完全一致的。抓住这一点,那么对于理解MFC程序的运行机制也就相对于简单了。C中的main函数就相当于MFC中的WinMain函数。感兴趣的可以利用VC的断点设置自己跟踪下面讲述的各个函数,就明白它的执行顺序了。一、C语言程序执行步骤在C语言中,大约的步骤如下:1, 全局变量内存分配2, 进入main函数二、MFC程序的运行步骤(主要是初始化)打开一个MFC APPWizard(exe)工程,跟踪其执行步骤,可以发现,是以下顺序:1) CXXApp中的全局变量定义CXXApp theApp;2) 调用CXXApp构造函数CXXApp :CXXApp()3) 进入Winmain函数(_tWinMain为宏,值为WinMain)_tWinMain()4) 完成初始化工作:包括窗口类注册、窗口产生、显示和更新pThread-InitInstance()对于MFC程序,MainFrame,View,ToolBar,Controlbar等都是窗口,所以下面的窗口注册与创建、显示等要反复调用多次,一次对应一个窗口(1) 注册窗口类AfxEndDeferRegisterClass(2) 创建窗口CMainFrame:PreCreateWindow()/反复调用一次是给我们修改窗口属性的机会CFrameWnd:Create()(3) 消息循环PumpMessage()补充1:在MFC中,由于涉及到(窗口)类定义,所以定义全局变量的时候,需要进行更多的步骤。全局变量涉及到类定义(类似于C中的类型定义)的话,那么需要遵循以下步骤(以MFC的窗口类为例)1) 设计一个窗口类2) 注册窗口类3) 创建窗口4) 显示及更新窗口5) 消息循环补充2:其他需要注意的几点1, 每一个MFC程序,有且只有一个从WinApp类派生的类(应用程序类),也只有一个从应用程序类所事例化的对象,表示应用程序本身。在WIN32程序当中,表示应用程序是通过WINMAIN入口函数来表示的(通过一个应用程序的一个事例号这一个标识来表示的)。在基于MFC应用程序中,是通过产生一个应用程序对象,用它来唯一的表示了应用程序。2, _tWinMain函数中通过调用AfxWinMain()函数来完成它要完成的功能。(Afx*前缀代表这是应用程序框架函数,是一些全局函数,应用程序框架是一套辅助生成应用程序的框架模型,把一些类做一些有机的集成,我们可根据这些类函数来设计自己的应用程序)。3, 设计窗口类:在MFC中事先设计好了几种缺省的窗口类,根据不同的应用程序的选择,调用AfxEndDeferRegisterClass()函数注册所选择的窗口类。4, PreCreateWindow()是个虚函数,如果子类有则调用子类的。5, CreateWindowEx()函数参数与CREATESTRUCT结构体成员完全一致,CreateWindowEx()函数与CREATESTRUCT结构体参数的对应关系,使我们在创建窗口之前通过可PreCreateWindow(cs)修改cs结构体成员来修改所要的窗口外观。6,注意两个函数。:TranslateMessage(&m_msgCur)函数进行消息(如键盘消息)转换:DispatchMessage(&m_msgCur)函数分派消息到窗口的回调函数处理(实际上分派的消息经过消息映射,交由消息响应函数进行处理。)7,可以认为View类窗口是CMainFram类窗口的子窗口。DOCument类是文档类。DOC-VIEW结构将数据本身与它的显示分离开。文档类用于数据的存储,加载;视类用于数据的显示,修改8,CTEApp:InitInstance()函数中通过文档模板将文档类,视类,框架类的有机组织一起。语句如下:CSingleDocTemplate* pDocTemplate;pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CTEDoc), RUNTIME_CLASS(CMainFrame), / main SDI frame window RUNTIME_CLASS(CTEView);AddDocTemplate(pDocTemplate);/增加到模板补充3:本课涉及到MFC函数的源文件位置根目录找到您安装VC98下MFC的位置,比如我的机子上为:D:Program FilesMicrosoft Visual StudioVC98MFC。下面提供的就是相对路径了。CWinApp构造函数: MFC=SRC=APPCORE.CPPAfxWinMain:MFC=SRC=WINMAIN.CPPAfxEndDeferRegisterClass: MFC=SRC=APPCORE.CPPCFrameWnd:PreCreateWindow()函数所在文件:MFC=SRC=WINFRM.CPPCFrameWnd:Create()函数路径:MFC=SRC=WINFRM.CPPCWnd:CreateEx()函数路径:MFC=SRC=WINCORE.CPPCWinThread:Run()方法路径:MFC=SRC=THRDCORE.CPP创建按钮1在CMainFrame创建双击CMainFrame,添加数据成员,CButton m_btn在OnCreate方法添加如下代码:htmlview plaincopy1. m_btn.Create(TEXT(firstButton),BS_PUSHBUTTON|WS_CHILD,CRect(0,0,1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论