系统编程教程第五章MFC基础.ppt

  1. 1、本文档共53页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 宏定义及动态识别示例 Inline CObject:~CObject(){} // 下面是一系列宏定义 //RUNTIME_CLASS宏用来取得class_name类中CRuntimeClass结构的地址 #define RUNTIME_CLASS(class_name) ((CRuntimeClass*) class_name::class##class_name; 实现过程见AFX.H和OBJCORE..CPP 文件 应用实例见例题:05TypeIdentify~05DynCreate * DECLARE_DYNAMIC等宏定义 对一些固定格式的代码可以使用宏定义 CRuntimeClass(运行时创建类)可以用宏定义来实现 #define DECLARE_DYNAMIC(class_name)\ public:\ static const CRuntimeClass class##class_name;\ virtual CRuntimeClass *GetRuntimeClass() const; 与DECLARE相对应的是实现(IMPLEMENT) 在动态识别的基础上,向类里添加一个创建该类的静态成员函数可以完成类的(对象)动态创建功能 #define DECLARE_DYNCREATE(class_name)\ …(p145) * VC++的基本调试 VC++生成程序有两种版本 调试版--Win32 Debug 发行版--Win32 Release 两种可在工具栏中设置:调试应选Win32 Debug * VC++的基本调试方法 单步调试: 按F10程序从主程序第一行开始执行 再按F10执行下一条语句 按F11执行到当前行内部 按Control+F10暂停 按Shift+F5调试终止 * VC++的基本调试方法 设置断点: 在要设置断点行单击鼠标右键 在弹出快捷键中选择“Insert/Remove Breakpoint可以插入或取消断点 按F5则带调试执行,到断点时停下 按F10或F11执行单步调试 * 带调试运行(按F5)程序向调试器输出信息,由OutputDebugString函数完成这一功能: #includewindows.h void main() { ::OutputDebugString(“Don’t you see we are in the debug window? \n”); } VC++的基本调试输出 * * 跟踪与断言 用汇编命令 int 3 可在代码中设置断点 #define AfxDebugBreak()_asm{int 3} 调用AfxDebugBreak函数,带调试运行可获得断点: 按F10单步调试找出断点原因 * 当程序执行到“int 3” 指令时(按F5)暂停, VC++ 弹出对话 框。关闭对话框,按F10,可单步调试,按Sheft+F5程序退出 跟踪与断言 * 框架程序中的映射 数学中的映射及在内存中的表示 x 1 10 20 y 110 110 300 pNext key value pNext key value pNext key value 1 110 10 110 NULL 20 300 * Windows程序中的映射关系 窗口类CWnd用来控制线程中的所有窗口,但窗口句柄只有一个,因此每一个窗口的窗口句柄应对应唯一的CWnd指针,这是程序中的一个映射关系; 处理窗口发来的消息,通过窗口函数WndProc传来的句柄值获得此窗口对应的CWnd指针,再用此指针调用CWnd类的接口成员; 封装一个类(CMapPtrToPtr)来保存有映射关系的数据。 * 内存分配方式 CMapPtrToPtr类保存若干个映射项,每个项保存一对映射关系:键(key),值(value) 每个映射项中还记录下一映射项地址: Struct CAssoc { CAssoc*pNext; void *key; void *value; }; * 内存分配方式 为避免内存碎片要预先为CAssoc分配一块较大的内存,使得在CAssoc申请空间时使用预留空间 其实施方法是把分配(删除)内存的全局函数CPlex* Create(…)(FreeDataChain())封装到CPlex结构中(p151-152, _AFXPLEX.H, PLEX.CPP 文件) CPlex的内存组织形式如下: 真正的数据区,此处为一系列CAssoc类型的数据 pNext 真正的数据区,此处为一系列CAssoc类型的数据 pNext pHead * 分配内存空间

文档评论(0)

精品课件 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档