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

下载本文档

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

文档简介

有了一定的有了一定的 Windows32 编程知识 就能学习编程知识 就能学习 MFC 了 了 在学习在学习 MFC 之前 一定要弄明白之前 一定要弄明白 Windows32 编程中的消息循环是怎编程中的消息循环是怎 么回事 么回事 MFC 实际上就是对实际上就是对 Windows API 函数的封装 函数的封装 在在 Windows 程序设计编程中 创建一个窗口要经历下面四个过程程序设计编程中 创建一个窗口要经历下面四个过程 如如 有不懂 请看博客有不懂 请看博客 win32 初窥初窥 1 设计一个窗口类 设计一个窗口类 2 注册窗口类 注册窗口类 3 创建窗口 创建窗口 4 显示及更新窗口 显示及更新窗口 同样 同样 MFC 中也是一样的 只是封装了而已 很多人认为中也是一样的 只是封装了而已 很多人认为 MFC 很难很难 学 看着书本能编程序 但是却编写不了自己的程序 为什么呢 因学 看着书本能编程序 但是却编写不了自己的程序 为什么呢 因 为还没有理解为还没有理解 MFC 的原理的机制 的原理的机制 市场上有很多有关市场上有很多有关 VC 的书本 但是很少有将的书本 但是很少有将 MFC 原理讲得比较透原理讲得比较透 彻的 引用孙鑫老师的话 彻的 引用孙鑫老师的话 同样的 同样的 WinMain 也是入口函数 具体的过程 请看孙鑫视频也是入口函数 具体的过程 请看孙鑫视频 20 讲讲 之第三讲之第三讲 其中 孙鑫老师开始提出的一个问题是 其中 孙鑫老师开始提出的一个问题是 在全局变量中 定义一个子类对象 在全局变量中 定义一个子类对象 html view plain copy 1 include 2 include 3 using namespace std 4 5 class Person 6 7 public 8 Person p 9 Person 10 11 p this 保存 this 指针 12 13 virtual void say 14 15 cout Person s say endl 16 17 18 19 20 class Student public Person 21 22 public 23 24 Student 25 26 27 28 void say 29 30 cout Student s say say 这里将调用子类的方法 41 return 0 42 什么都不用做 直接用向导生成一个什么都不用做 直接用向导生成一个 MFC 窗口 窗口 下面是结构图 有五个类下面是结构图 有五个类 是这样命名的 开头的是这样命名的 开头的 C 表示表示 Class C 工程名工程名 App Doc View 其中其中 CMainFrame 表示一个窗口表示一个窗口 主窗体 包括标题栏 菜单主窗体 包括标题栏 菜单 XXApp 表示运用程序 表示运用程序 XXDOC 表示文档类表示文档类 加载数据 实现数据的存加载数据 实现数据的存 储与操作分离储与操作分离 XXView 也表示一个窗口也表示一个窗口 相当于相当于 Windows 的客户区的客户区 下面看看下面看看 MFC 中类的主要继承关系 中类的主要继承关系 由于继承树太大 这里只罗列了由于继承树太大 这里只罗列了 CWnd 的继承关系的继承关系 API 中中 CreateWindowEx 和和 CreateWindow 几乎是一样的 几乎是一样的 Ex 表示表示 扩展 多了一个参数扩展 多了一个参数 下面用下面用 API 模拟模拟 CWnd just 模拟模拟 html view plain copy 1 下面是模仿封装 API 函数 2 3 class CWnd 4 5 public 6 BOOL CreateEX 7 DWORD dwExStyle extended window style 8 LPCTSTR lpClassName registered class name 9 LPCTSTR lpWindowName window name 10 DWORD dwStyle window style 11 int x horizontal position of window 12 int y vertical position of window 13 int nWidth window width 14 int nHeight window height 15 HWND hWndParent handle to parent or owner window 16 HMENU hMenu menu handle or child identifier 17 HINSTANCE hInstance handle to application instance 18 LPVOID lpParam window creation data 19 20 21 BOOL ShowWindow int nCmdShow 22 23 BOOL UpdateWindow 24 25 public 26 HWND m hWnd 27 28 29 BOOL CWnd CreateEx 30 DWORD dwExStyle extended window style 31 LPCTSTR lpClassName registered class name 32 LPCTSTR lpWindowName window name 33 DWORD dwStyle window style 34 int x horizontal position of window 35 int y vertical position of window 36 int nWidth window width 37 int nHeight window height 38 HWND hWndParent handle to parent or owner window 39 HMENU hMenu menu handle or child identifier 40 HINSTANCE hInstance handle to application instance 41 LPVOID lpParam window creation data 42 43 44 m hWnd CreateWindowEx dwExstyle lClassName lpWindowName dwStyle x y nW idth nHeight hWndParent 45 hMenu hInstance lParam 46 47 if m hWnd NULL 48 49 return TRUE 50 else 51 return FALSE 52 53 54 BOOL CWnd ShowWindow int nCmdShow 55 56 return ShowWindow m hWnd nCmdShow 调用的是 SDK 全局函数 加个 说明是全 局的 57 58 59 BOOL CWnd UpdateWindow 60 61 return UpdateWindow m hWnd 62 63 64 int WINAPI WinMain 65 HINSTANCE hInstance handle to current instance 66 HINSTANCE hPrevInstance handle to previous instance 67 LPSTR lpCmdLine command line 68 int nCmdShow show state 69 70 71 WNDCLASS wndclass 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 CWnd cwnd 82 cwnd CreateEx dwExstyle 83 84 cwnd ShowWindow nCmdShow 85 cwnd UpdateWindow 86 87 while GetMessage 90 DispatchMessage 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 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 Files Microsoft Visual Studio VC98 MFC 下面提供的就 是相对路径了 CWinApp 构造函数 MFC SRC APPCORE CPP AfxWinMain MFC SRC WINMAIN CPP AfxEndDeferRegisterClass MFC SRC APPCORE CPP CFrameWnd PreCreateWindow 函数所在文件 MFC SRC WINFRM CPP CFrameWnd Create 函数路径 MFC SRC WINFRM CPP C

温馨提示

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

最新文档

评论

0/150

提交评论