我的上课笔记---vc与数据库技术.pdf_第1页
我的上课笔记---vc与数据库技术.pdf_第2页
我的上课笔记---vc与数据库技术.pdf_第3页
我的上课笔记---vc与数据库技术.pdf_第4页
我的上课笔记---vc与数据库技术.pdf_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

VC 与数据库技术笔记 李祎 1 vc 与数据库技术与数据库技术 备课笔记备课笔记 合肥学院电子与电气工程系 李祎 2010 2 24 VC 与数据库技术笔记 李祎 2 目录 第一课 面向过程编程思想和编程规范 3 1 1 说说学习 VC 与数据库技术 的理由 3 1 2 学习什么呢 3 1 3 学习的基础是什么呢 4 1 4 面向过程的程序设计思想 4 1 5 指针的威力 5 1 6 结构体数据 6 1 7 调试技巧 6 第二课 面向对象编程思想和编程规范 7 2 1 第一次课的复习和补充 7 2 2 面向对象的编程思想 8 2 3 建立类 11 2 4 建立子类 14 2 5 多态 15 第三课 WINDOWS 编程基础与 MFC 基础 21 学习目标 21 3 1WINDOWS 编程的两个特点 21 3 2MFC 的类结构 26 3 3MFC 的消息处理机制 29 3 4 基本控件 文本框 的读写 30 3 5 简单程序的编写 人力资源管理系统 简易 30 第四课 模式与非模式对话框 33 学习目标 33 复习 33 4 1 对话框组件的完整路径 33 4 2 两种对话框 34 4 3 两种对话框之间的数据传递技术 36 4 4 案例 小小计算器的制作 37 第五课 单文档 41 学习目标 41 VC 与数据库技术笔记 李祎 3 第一课第一课 面向过程编程思想和编程规范面向过程编程思想和编程规范 1 1 说说学习说说学习 VC 与数据库技术与数据库技术 的理由的理由 1VC 1 VC 不是一门语言 而是一种非常好的工具 如果说成是语言 那就是微软的语言 是它的御用工具 使用这种工具不必感恩待德 因为这是微软的计谋 是专门开发 windows 窗口程序的工具 2 VC 开发窗口程序有先天优势 并且还做了一个 MFC 使用起来更加方便 3 VC 应用广泛 比如说嵌入开发 基于上面原因 要学习 2 数据库 1 2 学习什么呢学习什么呢 1MFC 1 微软的基础类 窗口类 画笔类啊 2 文档视图框架模型 看的到的 看不到的 中间的 如果只有一个架子 后面只有一个文档 叫单文档 如果有多个架子叫多文档 如果架子和视图混在一起叫对话框 以上四次课 二周 2 数据库技术 1 建立库 表 找到关联 2 如何操作表里的数据 查询 插入 删除 更新 以上两次课 一周 3ADO 技术 1 程序如何和数据库相联呢 需要 ADO 这是一个标准技术 asp vb vc delphi 等都可以 2 改造 ADO 封装自己的 ADO 类 带走 以上两次课 一周 4 综合实例 将上面三个结合起来 做一个案例 成绩管理系统或者学生档案管理或者家庭财务管理 系统分析 功能描述 库表建立 结构建立 编程程序 计划二周的时间完成部分功能 以上共 6 周的时间 VC 与数据库技术笔记 李祎 4 1 3 学习的基础是什么呢学习的基础是什么呢 1 C 语言基础 谁能告诉我 C 语言最美的是什么 面向过程的编程思想是什么 如何编写多文件 多人合 作怎么开展 所以用一周的时间 2C 语言的一些特质 多态是什么 多态的步骤是什么 为什么要用继承 所以用一周的时间 1 4 面向过程的程序设计思想面向过程的程序设计思想 1 大象的经历 把大象放冰箱里 ElephantExperience cpp 大象的经历 1 openTheDoor 2 inputElephant 3 closeTheDoor Elephant cpp openTheDoor inputElephant closeTheDoor Elephant h openTheDoor inputElephant closeTheDoor 注 文件名名词 动作模块是动词 2 求两个数的最大数 并求最大数的平方值 Ex1 4 2 先画模型结构 再模块分析一下 注文件名的规约 项目名起 MaxSquareProj 这是比较好 或者就起 Ex1 4 2 这是为了配合笔记去查询相应 代码 源码名 MaxSquareMain 比较好 不要再起 Ex1 4 2Main 了 不好 VC 与数据库技术笔记 李祎 5 1 5 指针的威力指针的威力 1 一个无法解决的问题 交换两个数 Ex1 5 3 错误的例子 直接交换 原因 模块是相互绝缘的世界 2 指针的概念和使用指针的基本步骤 使用指针的三步曲 上机实验 使用指针的方法对给定的三个数进行排序 3 指针的强大 指针是 C C 最大的特色 可以指向一切 其原因一切都在内存里占了一空间 1 指向数组 int a 10 p a 2 指向函数 int getMax int a int b int p getMax 4 指针作为函数的参数才是发挥作用的最大地方 其原因是将一段空间的地址告诉另一个模 块 另外一个模块可以操作它了 将一个数组进行排序 Ex1 5 1 include void sort int p int n for int i 0 i n 1 i for int j i 1 jp j temp p i p i p j p j temp void display int p int n for int i 0 i n 1 i cout p i fNo 3 1 7 调试技巧调试技巧 1 分开编译 2 编译错误主要就是语法错误 3 连接错误主要就是信誓旦旦 但誓言与行为差距过大 4 运行错误 是语义出错 VC 与数据库技术笔记 李祎 7 第二课第二课 面向对象面向对象编程思想和编程规范编程思想和编程规范 2 1 第一次课的复习和补充第一次课的复习和补充 1 各种名称的规定 匈牙利命名法是一种编程时的命名规范 是针对变量名称的一种起名方法 基本原则是 变 量名 属性 类型 对象描述 不过 这是一种理想 有点麻烦 但最少做到下面 1 有意义 2 统一一致 文件名名词 开头用大写 模块名动词 开头用小写 例如 交换两个数的大小 ExchangeProj ExchangeMain cpp Int cpp Int h 2 指针的使用标准方法 1 指针的概念 是一个事物的另外一个方面 a 与 pR2 b sqrt b b 4 a c 2 a void main float a b c cin a b c float r1 r2 setRoots a b c cout r1 fNo 10 p fNo 10 两种方法都是可以的 2 2 面向对象的编程思想面向对象的编程思想 2 1 面向对象的编程思想 面向过程是分步去做事 面向对象是将分步做的事情交给一个专门的对象去管理 让对象之 间相互协调完成整个系统 举例来说 一个学校的管理系统是很复杂的 校长是将每一件事 都考虑到呢 还是分成若干部分 指定负责人 然后让他们相互联系呢 所以 OO 的思想就是 抽象抽象 协调协调 合作合作等 最基本的是抽象最基本的是抽象 也就是抽象出那些对象来也就是抽象出那些对象来 2 2 面向对象程序设计中三种重要角色 1 对象 活生生的东西 对象是客观存在的事物 是一个活生生的东西 比如说孙悟空是一个活生生的对象 家住水 帘洞 白骨精也是一个活生生的对象 家住盘丝洞的那位 再比如说下面停着的那辆红色的 车牌号是 JP888 的车就是一个活生生的对象 比如说我手里的粉笔就是一个活生生的对象 面向对象程序设计中我们操作的就是这些活生生的对象 一个对象有三个特征 属性 方法 事件 这种对象我们无法用前面的基本 高级 构造类型来实现的 现在可以用类这种数据 类型来实现 2 类 对象的模板 是一种抽象的概念 是对象的抽象 就象上帝制造人的时候 先造一个模子 然后用这个模具去生成了千千万万的活生生的对象 人 3 编程者 造物主 编程者就是造物主 你要先建立模板 类 然后根据类造万千对象 让这些对象发生联系 2 3 类的三大特征 1 封装 封装指数据和方法是合在一起的 类的结构可以用一个鸡蛋来表达 蛋黄是数据 蛋清是方 法 蛋壳是接口 把数据封装在蛋黄里 蛋清是这个类的全套本事 但不外显的 蛋壳是显 示出来的本事 这就是面向对象的重要特征 封装 下图表达人类的封装情况 VC 与数据库技术笔记 李祎 9 作为人类来说 共有的属性数据有姓名 年龄 身高 体重 配偶等 这些数据是放在内部 的 我们称之为 private 私有成员 用红字表示 这些数据成员对于外部来说是看不见的 受 到强烈保护 人类有很多的能力 这些能力可以看成由两个方面组成这些能力可以看成由两个方面组成 其中一个方面是和外 界联系紧密 呈外显特征 称为 public 成员接口 用绿字表示 比如说起立行走 说话 谈恋爱 唱歌 改变身高 改变体重等 还有一个方面是内显的 是外界和内部成员数据勾 通的桥梁 起着协调控制作用 称为成员方法 比如说锁定目标的机制 协调身体运行机制 检查冲突机制 心理调节机制等 这些内显的功能起着联系外部接口和内部数据的作用 起 协调保护功能 内显的方法一般用 private 用红字表示 或 protected 用黄字表示 来表示 比如说针对外部 public 接口 谈恋爱 就会自动地调用内显的 protected 方法 目标锁定机 制 在这个机制里 会根据自己的价值观 人生观去定位相似形 如定位标准皮肤白 人 要温柔 家庭条件要好 出身要显贵 通过一系列的权衡比较 最终把目标确定为七仙女 把七仙女填入 fMate 中 再比如说 调用外部接口 改名 也会使用内部成员方法 心理 调节机制 检查一下发送命令的是不是父母或者自己 如果不是 当然是心理上不能接受的 这样就不可能去修改 fName 数据成员 当然 经常在一些简单的情况下 外部接口也可以不通过内显的方法 而直接操作内部数据 实际上大多数初学者最习惯的就是通过外部接口直接修改内部成员数据 比如说调用外 部接口 改变身高 在没有采取极端措施的前提下 通过增加营养 锻炼身体而不是把腿 骨折断再接上 是可以直接改变 fHeight 的 根据这个 人 类我们定义的对象 只能使用外部接口 用绿字表示 2 继承 仅考虑公用继承的情况 继承是最大使用已有资源 子类继承了基类里的所有资料 当然除全盘继承之外 作为子类 应该自己的一些新的数据 新的方法 新的接口 这些接口扩展了子类 使子类更丰富 比 如说下图中的男人类就有新的胡子 fBeard 数据 新的刮胡子接口 shaveBeard VC 与数据库技术笔记 李祎 10 这里要注意的是 子类虽然继承了父类的所有内容 但对子类来说 父类的 private 成员遗 传到子类的时候 是看不见的 子类能够看见的是父类传下来的 public 接口 这里没有考虑 protected 的情况 看不见就不能直接使用 看得见就可以直接使用 父类传下来的接口作为了子类的接口 这里只考虑公用继承的模型 对于上面的例子来说 行走 说话 谈恋爱 唱歌 改变身高 改变体重这些接口都完全成为男人类的接口 而父 类的私有的成员数据和成员方法都是不能直接用的 比如说 fName fMate 等数据成员和 adjustMentality 等数据方法 根据这个 男人 类我们定义的对象 只能使用外部接口 绿字表示的内容 一般情况下 从父类继承生成的子类 有三点值得我们注意 第一 子类一般都会增加新的 数据和新的方法或者新的接口 第二 从父类里来的内容 只要是父类私有的 子类里看不 见 都不能直接用 第三 子类只能用父类 public 成员接口和特意代代相传的 protected 成 员方法 温馨提示 1 每一个类层次只能有三个东西可直接用 第一是本类新添加的数据成员或者成 员方法或者接口方法 第二是父类传下来的共用接口 第三 父类特意传递给子类的 protected 数据成员或者 protected 成员方法 温馨提示 2 从外部来看 使用对象的角度 直接能够使用的就是外部接口 用绿字表示 从内部来看 从类的角度 直接能够使用的是看的见的部分 非灰色部分 思考 1 上图男人类中能直接使用的有哪些 2 对于 fHeight 不能直接用 那怎么用 答案 1 男人类只能直接用接口部分 本类的数据成员 fBeard 身体协调机制等 即父类中的私有 部分不能直接使用 上图灰色部分 2fHeight 不能直接用 设置这个数据的时候 就用 changeHeight 来改变 fHeight 而这个方 法是父亲传下为的接口 3 多态 一种方式 多种表达就叫多态 从遗传的角度来看 可以理解为变异 VC 与数据库技术笔记 李祎 11 谈恋爱都用 love 来表示 男人类谈恋爱 目标是找一个异性 作为其子类谈恋爱 谈恋爱 的方式是不一样的 比如说中国人谈恋爱皮肤越白越好 中国东西男人谈恋爱可能就非要对 方会二人转不可 而非洲人谈恋爱说不定皮肤越黑越好 2 3 建立类建立类 1 画类图 Person fId int fName char 20 fHeight float fWeight float fMate char 20 Person setFId void setFName void setFHeight void setFWeight void sing void dance void run void love void assortBody lockTarget collideCheck adjustMentality MalePerson fBread char 20 MalePerson shaveFBread void love void ChinaMalePerson ChinaMalePerson love void AfricaMalePerson AfricaMalePerson love void 2 建类的结构 建立一个人类 提供数据成员身份号 姓名 提供三个接口 构造函数执着口 设置身份号 接口 设置姓名接口 显示学生信息接口中 Ex2 3 2 或者 PersonTestProj VC 与数据库技术笔记 李祎 12 Person fId int fName char 20 Person setFId id int void setFName name char 20 void display void from C Reverse Engineered Person h class Person public Person void setFId int id void setFName char name 20 void display protected private int fId char fName 20 Person cpp include include include Person h Person Person fId 0 strcpy fName noname void Person setFId int id fId id void Person setFName char name 20 strcpy fName name void Person display cout fId fName VC 与数据库技术笔记 李祎 13 PersonTestMain cpp include Person h void main Person p p display 3 重载构造函数 按上面定义的一个人 总是千人一面的 都是 0 无名氏 能不能产生一个对象的时候给它 一些初始值呢 这可以通过重载的构造函数来解决 1 在 h 文件里定义 Person int id char name 2 在 cpp 文件里实现 Person Person int id char name fId id strcpy fName name 在主程序里可以这样定义 Person p 1 liyi 4 构造函数里数据成员的初始化 1 可以在函数体里写 如上面的代码 2 可以在函数的头部写 参数初始化表对数据成员初始化 格式如 Person fID 111 这种方法 不是在函数体内 而在函数首部实现 初始化表的 时候 各分量之间用 号分开 还要注意函数体 里即使没有东西 格式也是要的 格式如 下 Person Person fId 111 fId 0 strcpy fName noname 5 重载构造函数里数据成员的初始化 Person Person int id char name fId id strcpy fName name VC 与数据库技术笔记 李祎 14 2 4 建立子类建立子类 1 类图结构 Person fId int fName char 20 Person setFId id int void setFName name char 20 void display void from C Reverse Engineered Student fNo int Student setFNo no int void display void from C Reverse Engineered 2 代码 略 问题一 Student 如何显示利用 Person 的构造函数 不讨论隐式的了 1 在代码里第一行写语句 Student Student fId 1 错误 根本不能操作 Person Person fNo 0 2 将用参数初始化表对数据成员初始化 Student Student Person fId 1 错误 根本不能操作 fNo 0 注 当然 如果父类里有多个构造函数 以上两种方式都是可以的 如 Student Student Person 333 wym fNo 0 问题二 Student 如何显示利用 Person 的 display 成员函数 void Student display cout endl Person display 这里使用了父类的 display 成员函数 cout disp student ps ps ps disp 以上程序一点问题都没有 问题如下 ps 父亲给儿子不行 马是白马当然有问题 pp 儿子给父亲行 白马是马可以 pp disp 这个方法是谁的 是老子的 pp setFNo 3 可以这样用吗 不能用 因为老子没有这个接口 问题解释 1 从哪里定义 就从哪里出发 2 setFNo 不是父类的方法函数 因此不能用 苦恼 既然接过儿子的钥匙钥匙旗帜 又不能用 也不能动儿子的东西 不是很苦恼吗 答案 虚拟一个 virtual void setFNo int no 这样看似用自己的东西 其实是用儿子的东西了 这就 是多态的实际用法 这样上面的 pp setFNo 3 就可以用了 而且用的是儿子的东西 再次苦恼 为何要从父亲出发用 父亲为何要接儿子的地址 父亲设虚后 pp setFNo 3 这样做的好处 到底是什么呢 再次答案 接了儿子的地址是向上转型 向上转型是为了多态 多态可以让我们更真实的贴近客观世界 2 5 多态多态 1 一个说话的例子 界面上要求三种人说话 一个是中国人 一个是英国人 一个是日本人 当我们动态选择一 个人的时候 他就会用本国语言说话 分析 我们建立这样几个类 person 类 chinaperson 类 frenchperson 类 japanperson 类 画出 类图结构 并写出相应的代码 VC 与数据库技术笔记 李祎 16 AmericanPerson say ChinesePerson say JapanesePerson say Person say Person h 文件代码文件代码 class Person public void say Person cpp 文文件代码件代码 void Person say 什么都不要写 ChinesePerson h 文件代码文件代码 include Person h class ChinesePerson public Person public void say ChinesePerson cpp 文件代码文件代码 include ChinesePerson h include void ChinesePerson say cout 我是中国人 endl 主模块测试主模块测试文件文件 TestSayMain 代码代码 include ChinesePerson h include AmericanPerson h include JapanesePerson h include include void main VC 与数据库技术笔记 李祎 17 ChinesePerson cbody NULL AmericanPerson abody NULL JapanesePerson jbody NULL cout choice switch choice case 1 cbody new ChinesePerson break case 2 abody new AmericanPerson break case 3 jbody new JapanesePerson break 让刚才产生的那个人说话 怎么办 是用 cbody abody jbody 中哪一个 我们无法确定 是因为我们事前并不知道生成了哪个对象 困惑之处 为什么我们产生了一个具体的对象 人 之后 让他说话这么难呢 原因 就在于对象是自动生成的 是临时生成的 我们没有办法确定是谁 解决方案 我们的解决办法就是向上转型 然后再用多态 具体地说 将 Person 类里 的成员方法 say 变虚 甚至可以变成纯虚 然后在主模块里使用各类人的时候统一定义一 个指针 下面先给出类图结构 请比较一下和上面类图的区别 AmericanPerson say ChinesePerson say JapanesePerson say Person say 使用多态之后的主模块测试主模块测试文件文件 TestSayMain 代码代码 include ChinesePerson h include AmericanPerson h include JapanesePerson h include Person h include iostream h void main person p cout choice VC 与数据库技术笔记 李祎 18 switch choice case 1 p new chineseperson break case 2 p new americanperson break case 3 p new japanesperson break p say 2 向上转型和多态使用步骤 1 父类成员函数变虚 叫虚函数 2 子类同名成员函数有新的解释 3 父类指针 指向子类对象 3 向下转型 1 向下转型的目的 向下转型为了稳态 是还原对象本来的状态 形象地说 向下转型就是把父亲给儿子 前面已经说过了 父亲是不能够直接给儿子的 如果要给就必须要强制向下转型 例如 刚才的例子中 如果产生的具体人是美国人的话 除了说话之外 还要拥抱 怎么办 把 刚才产生的一个对象强制转成美国人 下面给出相应的类图结构 AmericanPerson say embrace ChinesePerson say handshake JapanesePerson say embrace Person say 程序代码修改如下 p say if typeid p typeid AmericanPerson AmericanPerson p embrace 注意 要动态的确定运行时指针真实所指的对象类型 要将 RTTI 打开 具体的方式是 在 VC 编辑环境中 Project Settings C C Language 勾选 Enable RunTime Type Information 2 向下转型的注意 一定要进行一个判断 如果上来就转用 AmericanPerson p embrace 会出现什么问题 呢 假如实际上产生的是中国人 中国人没有那个习惯就出问题了 即中国人类没有那个 成员函数 即便有那个习惯 实现执行的却是美国式的拥抱 这当然也是错误的 当然 如果你确实清楚到底是什么类型 也可以直接写 VC 与数据库技术笔记 李祎 19 4 实验分解 1 实验题目 有改动有改动 建立一个几何形状 Shape 类 并设计成抽象类 类中无数据成员 只有纯虚函数 getArea 求面积 getLen 求周长 设计出三角型子类 Tri 类 属性是三边的边长 接口成员有 构 造函数 Tri 重载的构造函数 Tri float a float b float c getArea 求面积 getLen 求周长 display 显示基本数据成员 长方形子类 属性有长和宽 接口成员有 构造函数 Rect 重载的构造函数 Rect float height float width getArea 求面积 getLen 求周长 display 显 示基本数据成员 在主程序中动态创建一个三角形对象和一个长方形对象 并赋于父类接口 然后通过多态的方法得到动态产生对象的周长和面积 并显示这个对象的基本信息 2 概要分析 要解决的是什么样的问题 解决这个问题的关键是什么 写出采用什么方案 是单文 档还是多文档 大致用到什么技术 本实验要求设计一个基类 Shape 并设计出它的两个子类 Tri 和 Rect 在主测试程序里产生 两个子类对象交给基类指针 测试多态的用法以及向下转型 本实验共需要 7 个文件 文件名如下 类的结构如下 Rect fHeight float fWidth float Rect Rect height float width float getLen float getArea float setSides height float width float void display void from C Reverse Engineered Shape getLen float getArea float from C Reverse Engineered Tri fA float fB float fC float Tri Tri a float b float c float getLen float getArea float setSides a float b float c float void display void from C Reverse Engineered 3 实验步骤 第一步 建立控制台项目 ShapeTestProj 第二步 建立 Shape 类 Shape h Shape cpp 如果 Shape 是抽象类 那么 Shape cpp 就可以不要 第三步 建立 Tri 类 Tri h Tri cpp 第四步 建立 Rect 类 Rect h Rect cpp 第五步 建立主测试程序 ShapeMain cpp 代码如下 include Tri h include Rect h include Shape h VC 与数据库技术笔记 李祎 20 include include void main Shape p p new Tri 3 4 5 float len len p getLen cout 三角形周长 len display 4 数据预测 5 实验调试 6 实验总结 7 实验思考 8 实验自评 A 书写整洁 版面规范 B 设计合理 代码齐全 C 调试详细 标识清楚 D 总结深刻 自评到位 VC 与数据库技术笔记 李祎 21 第三课第三课 WINDOWS 编程基础与编程基础与 MFC 基础基础 学习目标学习目标 了解 windows 编程的两个特点 窗口和消息 理解 MFC 类 掌握几种比较常用类的使用 初步掌握消息映射机制的使用方法 掌握几种常用的组件及使用方法 尤其是文本框 初步掌握简单对话框程序的编写方法 3 1WINDOWS 编程的两个特点编程的两个特点 1 窗口 1 资源 窗口里到处是 标题栏 菜单栏 图标 光标 工作区等大量的资源 2 窗体 如何看到这个窗体呢 A 首先注册窗体首先注册窗体 窗口风格 窗口函数 winproc 各种资源名称如菜单 图标 光标 将下 面代码写在 MyRegisterClass 模块模块中 WNDCLASSEX wndClassEX 用来描述主窗口的结构 wndClassEX cbSize sizeof wndClassEX 结构的大小 wndClassEX style 0 类的式样 CS 这个一般设置为 0 wndClassEX lpfnWndProc WndProc 窗口函数指针 wndClassEX cbClsExtra 0 配置给这个类的额外內存 一般为 0 wndClassEX cbWndExtra 0 配置给这个类的每个窗口的额外內存 一般为 0 wndClassEX hInstance hInstance 这是应用程序的实例句柄 wndClassEX hIcon LoadIcon NULL IDI APPLICATION 使用预定义图标 VC 与数据库技术笔记 李祎 22 wndClassEX hCursor LoadCursor NULL IDC ARROW 使用预定义光标 wndClassEX hbrBackground HBRUSH COLOR WINDOW 使用白色背景画刷 wndClassEX lpszMenuName NULL 不指定菜单 wndClassEX lpszClassName my 窗口类的名称 wndClassEX hIconSm NULL 没有类的小图标 RegisterClassEx 注册这个窗口类 说是类 其实就是一种结构体 这里需要说明的是 句柄是 windows 程序为分配资源所标记的身份号 windows 编程就是创 建各种资源并交给句柄管理 调用各种函数 函数的参数是句柄 去显示资源的 B 建立窗体建立窗体 句柄句柄 并显示窗体并显示窗体 把图标 菜单等资源具体的句柄连上去 整合起来 注 意在 win32 编程里使用的大部分是句柄 而不是对象 类 将下面代码写在 InitInstance 模块模块中 HWND hwnd CreateWindowEx WS EX CLIENTEDGE 扩展样式 my 类名 My First Window 标题 WS OVERLAPPEDWINDOW 窗口风格 CW USEDEFAULT 初始 X 坐标 CW USEDEFAULT 初始 Y 坐标 800 宽度 600 高度 NULL 父窗口句柄 NULL 菜单句柄 hInstance 应用程序实例句柄 NULL 用户数据 if hwnd NULL MessageBox NULL 创建窗口出错 系统提示 MB OK ShowWindow hwnd nCmdShow 显示窗口 UpdateWindow hwnd 刷新窗口 第一个参数 WS EX CLIENTEDGE 是扩展的窗口式样 得到一个內部下陷的边框效果 你 可以设成 0 看看效果 要习惯于试不同的值看效果 第二个参数是窗口类的名字 告诉系统我们要创建什么样的窗口 上面我们注册的窗口名是 my 这里就简单地将 my 写进来了 第三个参数是窗口标题 第四个参数是 WS OVERLAPPEDWINDOW 是一个窗口式样参数 接下来的四个参数 CW USEDEFAULT CW USEDEFAULT 800 600 是我们窗口的左 上角的 X Y 坐标和其宽度和高度 我把 X Y 坐标设为 CW USEDEFAULT 来让系统自己 选择在屏幕的哪个地方来放置窗口 记住屏幕的最左边的 X 坐标为 0 并向右加 屏幕的顶 VC 与数据库技术笔记 李祎 23 部的 Y 坐标为 0 并向底加 单位是像素 这是屏幕在特定的分辨率下能显示的最小单位 再接下来的四个 NULL NULL g hInst NULL 分別是父窗口的句柄 菜单句柄 应用 程序实例句柄 和窗口创建数据的指针 在 windows 系统中 你屏幕上的窗口是以分层次 的父窗口 子窗口的形式来组织的 当你看到一个窗口中有一个按钮时候 按钮就是子窗口 包含它的窗口就是父窗口 上述代码中 父窗口的句柄为 NULL 因为这里沒有父窗口 这 个是是我们的主窗口或是顶层窗口 菜单也是 NULL 因为我们现在也沒有菜单 实例句柄 设为我们从 WinMain 得到的第一个参数 窗口的创建数据 我们几乎沒有使用 可以用来向 创建的窗口发送额外数据在这里也设为 NULL 2 消息 将上述代码放在 int APIENTRY WinMain 里出现不了窗口 为什么呢 因为 WINDOWS 的驱 动模式是消息模式 1 WINDOWS 是事件 消息 驱动模式 这是和 DOS 程序的本质不同 见教材 p46 2 有哪些消息 键盘动作 鼠标动作 定时器动作 自定义动作皆会产生消息 就连产 生一个窗体都要发送一条消息 WM CREATE 3 消息发生后 放在哪 当一个消息发生后 windows 系统会根据消息发生的各种因素组合在一起 形成一个消息放 在系统消息队列里 只有一个系统消息队列 再由 windows 的核心模块 USER 将这些消息 发送到相应的窗口 多任务可见一斑 的消息队列里 也可以看作是应用程序的消息队列 4 消息长的什么样 typedef struct tagMSG HWND hwnd 发送给哪个窗体 UINT message 消 息 类 型 一 般 以WM 开 头 的 窗 口 消 息窗 口 消 息 如 WM PAINT WM MOUSEMOVE 还可以 WM COMMAND 为归总的对菜单 工具栏的命命 令消息令消息 还可以 WM COMMAND 为归总的控件通知消息控件通知消息 BN CLICKED 等等 一般就是 这 3 种 另外消息类型的定义在 windows h 里说明 WPARAM wParam LPARAM lParam wParam lParam 这两个参数因消息类型的不同而不同 实际上它们是作为 消息发送负载的一些信息 用于信息的传递 DWORD time POINT pt MSG PMSG 5 消息如何响应 两种响应方式 传统的 API 的死循环里的统一回调方式和 MFC 的消息映射机制 VC 与数据库技术笔记 李祎 24 从上面的图中可以看出 经过了注册和初始化 建立和显示 之后 进入到了一个死循环里 这个死循环不断地取消息 分配消息给相应的窗口回调函数 在回调函数里对消息进行处理 主模块里的消息循环代码主模块里的消息循环代码 MSG msg while GetMessage DispatchMessage 回调函数里代码回调函数里代码 LRESULT CALLBACK WndProc HWND hWnd UINT message WPARAM wParam LPARAM lParam switch message case WM CREATE break case WM DESTROY PostQuitMessage 0 break default return DefWindowProc hWnd message wParam lParam return 0 总结 经过注册 产生 消息循环最后出现我们需要的窗体 3 举例 用 windows api 自动建立一个 hello world 程序 并改编 hello world 程序 产生的窗 口如下 VC 与数据库技术笔记 李祎 25 自己要创建的资源 句柄 产生方法 hwndButton CreateWindow edit NULL WS CHILD WS VISIBLE WS BORDER 10 60 200 25 hWnd NU LL NULL NULL hwndEdit CreateWindow button 计算 WS CHILD WS VISIBLE BS PUSHBUTTON 240 60 80 25 hWnd NULL NULL NULL 主要消息 对象 消息名 类别 目的 窗口 WM CREATE 窗口消息 产生按钮和文本框 按钮 小窗口 WM COMMAND lParam是hwndButton wParam 高位是消息码 BN CLICKED 控件消息 点击后得到文本框内 容 窗口 WM PAINT 窗口消息 重画窗口 回调函数代码 下面代码中黑体字部分是新增加的下面代码中黑体字部分是新增加的 原来自动生成代码不变原来自动生成代码不变 LRESULT CALLBACK WndProc HWND hWnd UINT message WPARAM wParam LPARAM lParam char str 80 这里加一个保存字符串的数组 下面用到 int wmId wmEvent 消息中参数 wParam 的低 16 位 id 号 和高 16 位 消息码 HDC hdc 设备环境句柄 PAINTSTRUCT ps 用来保存从设备环境中得到的信息 static HWND hwndButton hwndEdit 定义两个句柄定义两个句柄 这里一定要设置成静态的这里一定要设置成静态的 switch message case WM CREATE hwndEdit CreateWindow edit NULL WS CHILD WS VISIBLE WS BORDER 10 60 200 25 hWnd NULL NULL NULL hwndButton CreateWindow button 计算计算 WS CHILD WS VISIBLE BS PUSHBUTTON 240 60 80 25 hWnd NULL NULL NULL break case WM COMMAND 命令消息的 wParam 低 16 位是标记 lParam 无用 而控件消息的 wParam 低 16 位是标记 高 16 位是消息通知码 wmId LOWORD wParam wmEvent HIWORD wParam switch wmId case IDM ABOUT VC 与数据库技术笔记 李祎 26 DialogBox hInst LPCTSTR IDD ABOUTBOX hWnd DLGPROC About break case IDM EXIT DestroyWindow hWnd break default break 原来原来自动生成的一句去掉自动生成的一句去掉 if HWND lParam hwndButton InvalidateRect hWnd NULL NULL 重画重画 case WM PAINT hdc BeginPaint hWnd RECT rt GetClientRect hWnd TextOut hdc 10 40 RESULT strlen RESULT TextOut hdc 90 40 str strlen str EndPaint hWnd break case WM DESTROY PostQuitMessage 0 break default return DefWindowProc hWnd message wParam lParam return 0 总结 从 WIN32 编程来看 需要掌握众多的 API 掌握回调函数里捕捉消息以及处理消息 实际 操作的过程是比较复杂的麻烦的 MFC 出现对 API 进行了封装 对消息的处理进行了重新规划 并且创造性地引入了文档 视图 框架机制 3 2MFC 的类结构的类结构 1 整体类图 VC 与数据库技术笔记 李祎 27 从上面的类图上 可以看出来 MFC 所用到的类分分两种 第一是从 CObject 里继承的 第二是不是从那里继承的 1 可以分成 16 个大类 其中 CCmdUI 不是 CObject 的子类 这些类下面又有很多子类 从类名可以大致理解这些类的含义 2 不是从 CObject 里继承的类有 9 个 这个类下面也有更小的子类 2 CWnd 类 平常看到的窗口 对话框 视图 小控件都是这个类的子类 当然这个类本身向上追朔到基 类是 CObject 也窗口程序打交道 这个类用到的最多 3 CFile 类 CFile cfile char strs 1024 cfile Open file h CFile modeRead 在上面设置断点 然后不断的 f11 进入 shift f11 退出 一直到 open 函数 可以看到封装 的 Open 是如何调用 API 接口的 cfile Read strs 1024 MessageBox strs cfile Close 4CString 类 VC 与数据库技术笔记 李祎 28 5CTime 类 注意 如何在 msdn 取得帮助 1 查看整个类图 virsual c Microsoft Foundation Classes and Templates Microsoft Foundation Class Library MFC Hierarchy chart 2 查看类图的分类 virsual c Microsoft Foundation Classes and Templates Microsoft Foundation Class Library MFC Hierarchy chart categories 3 查看某个类的使用 比如查看 CEdit 这个控件类 方法一 virsual c Microsoft Foundation Classes and Templates Microsoft Foundation VC 与数据库技术笔记 李祎 29 Class Library MFC About the MFC classes Control Classes 方法二 直接 F1 3 3MFC 的消息处理机制的消息处理机制 消息映射机制就是将消息和消息处理函数联系起来 形成一一对应的关系 当窗口收到一个 消息 就会自动地去搜索消息映射表 并调用相应的函数 我们就在一个对话框上建立一个 按钮 并写简单的代码 然后我们来看看消息映射结构是什么样的 控件消息名是 BN CLICKED 1 举例 产生一个对话框程序 点击某一个按钮 弹出一个窗口 1 双击即可产生消息 2 通过向导产生 2 原理 1 申明处理函数 afx msg void OnAdd 2 关联起来 ON BN CLICKED IDC ADD OnAdd 3 写函数 void CXXXDlg OnAdd MessageBox aaa 3 注意点 1 对话框控件属性表 控件 ID 号 Caption 其他 按钮 IDC ADD 添加 默认 2 成员变量表 无 3 消息处理函数表 对象 ID 消息 消息处理函数 IDC ADD BN CLICKED OnAdd 一般情况下 默认的消息处理函数是根据对象的 ID 来命名的 只是前面加了一个 On 表示 要处理的之意 4 自定义消息原理 1 申明处理函数 afx msg LRESULT OnMyfunction WPARAM wparam LP

温馨提示

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

评论

0/150

提交评论