VS2010之MFC入门到精通教程

上传人:gbs****77 文档编号:9983497 上传时间:2020-04-09 格式:DOCX 页数:307 大小:499.79KB
返回 下载 相关 举报
VS2010之MFC入门到精通教程_第1页
第1页 / 共307页
VS2010之MFC入门到精通教程_第2页
第2页 / 共307页
VS2010之MFC入门到精通教程_第3页
第3页 / 共307页
点击查看更多>>
资源描述
VS2010 MFC 编程入门教程之目录 第一部分 VS2010 MFC 开发环境 VS2010 MFC 编程入门之前言 VS2010 MFC 编程入门之一 VS2010 与 MSDN 安装过程图解 第二部分 VS2010 MFC 应用程序框架 VS2010 MFC 编程入门之二 利用 MFC 向导生成单文档应用程序框架 VS2010 MFC 编程入门之三 VS2010 应用程序工程中文件的组成结构 VS2010 MFC 编程入门之四 MFC 应用程序框架分析 VS2010 MFC 编程入门之五 MFC 消息映射机制概述 第三部分 对话框 VS2010 MFC 编程入门之六 对话框 创建对话框模板和修改对话框属性 VS2010 MFC 编程入门之七 对话框 为对话框添加控件 VS2010 MFC 编程入门之八 对话框 创建对话框类和添加控件变量 VS2010 MFC 编程入门之九 对话框 为控件添加消息处理函数 VS2010 MFC 编程入门之十 对话框 设置对话框控件的 Tab 顺序 VS2010 MFC 编程入门之十一 对话框 模态对话框及其弹出过程 VS2010 MFC 编程入门之十二 对话框 非模态对话框的创建及显示 VS2010 MFC 编程入门之十三 对话框 属性页对话框及相关类的介绍 VS2010 MFC 编程入门之十四 对话框 向导对话框的创建及显示 VS2010 MFC 编程入门之十五 对话框 一般属性页对话框的创建及显示 VS2010 MFC 编程入门之十六 对话框 消息对话框 VS2010 MFC 编程入门之十七 对话框 文件对话框 VS2010 MFC 编程入门之十八 对话框 字体对话框 VS2010 MFC 编程入门之十九 对话框 颜色对话框 第四部分 常用控件 VS2010 MFC 编程入门之二十 常用控件 静态文本框 VS2010 MFC 编程入门之二十一 常用控件 编辑框 Edit Control VS2010 MFC 编程入门之二十二 常用控件 按钮控件 Button Radio Button 和 Check Box VS2010 MFC 编程入门之二十三 常用控件 按钮控件的编程实例 VS2010 MFC 编程入门之二十四 常用控件 列表框控件 ListBox VS2010 MFC 编程入门之二十五 常用控件 组合框控件 Combo Box VS2010 MFC 编程入门之二十六 常用控件 滚动条控件 Scroll Bar VS2010 MFC 编程入门之二十七 常用控件 图片控件 Picture Control VS2010 MFC 编程入门之二十八 常用控件 列表视图控件 List Control 上 VS2010 MFC 编程入门之二十九 常用控件 列表视图控件 List Control 下 VS2010 MFC 编程入门之三十 常用控件 树形控件 Tree Control 上 VS2010 MFC 编程入门之三十一 常用控件 树形控件 Tree Control 下 VS2010 MFC 编程入门之三十二 常用控件 标签控件 Tab Control 上 VS2010 MFC 编程入门之三十三 常用控件 标签控件 Tab Control 下 第五部分 菜单 工具栏与状态栏 VS2010 MFC 编程入门之三十四 菜单 VS2010 菜单资源详解 VS2010 MFC 编程入门之三十五 菜单 菜单及 CMenu 类的使用 VS2010 MFC 编程入门之三十六 工具栏 工具栏资源及 CToolBar 类 VS2010 MFC 编程入门之三十七 工具栏 工具栏的创建 停靠与使用 VS2010 MFC 编程入门之三十八 状态栏的使用详解 第六部分 文档 视图和框架 VS2010 MFC 编程入门之三十九 文档 视图和框架 概述 VS2010 MFC 编程入门之四十 文档 视图和框架 各对象之间的关系 VS2010 MFC 编程入门之四十一 文档 视图和框架 分割窗口 第七部分 MFC 常用类 VS2010 MFC 编程入门之四十二 MFC 常用类 CString 类 VS2010 MFC 编程入门之四十三 MFC 常用类 CTime 类和 CTimeSpan 类 VS2010 MFC 编程入门之四十四 MFC 常用类 定时器 Timer VS2010 MFC 编程入门之四十五 MFC 常用类 CFile 文件操作类 VS2010 MFC 编程入门之四十六 MFC 常用类 MFC 异常处理 第八部分 字体和文本输出 VS2010 MFC 编程入门之四十七 字体和文本输出 CFont 字体类 VS2010 MFC 编程入门之四十八 字体和文本输出 文本输出 第九部分 图形图像 VS2010 MFC 编程入门之四十九 图形图像 CDC 类及其屏幕绘图函数 VS2010 MFC 编程入门之五十 图形图像 GDI 对象之画笔 CPen VS2010 MFC 编程入门之五十一 图形图像 GDI 对象之画刷 CBrush 第十部分 Ribbon 界面开发 VS2010 MFC 编程入门之五十二 Ribbon 界面开发 创建 Ribbon 样式的应用程序框架 VS2010 MFC 编程入门之五十三 Ribbon 界面开发 为 Ribbon Bar 添加控件 VS2010 MFC 编程入门之五十四 Ribbon 界面开发 使用更多控件并为控件添加消息处理 函数 VS2010 MFC 编程入门之前言 鸡啄米的 C 编程入门系列给大家讲了 C 的编程入门知识 大家对 C 语言在语法 和设计思想上应该有了一定的了解了 但是教程中讲的例子只是一个个简单的例程 并没 有可视化窗口 鸡啄米在这套 VS2010 MFC 编程入门教程中将会给大家讲解怎样使用 VS 2010 进行可视化编程 也就是基于窗口的程序 C 编程入门系列主要偏重于理论方面的知识 目的是让大家打好底子 练好内功 在使用 VC 编程时不至于丈二和尚摸不着头脑 本套教程也会涉及到 VC 的原理性的 东西 同样更重视实用性 让大家学完本套教程以后 基本的界面程序都能很容易编写出 来 VC 简介 VC 全称是 Visual C 是由微软提供的 C 开发工具 它与 C 的根本区别就在 于 C 是语言 而 VC 是用 C 语言编写程序的工具平台 VC 不仅是一个编译器更 是一个集成开发环境 包括编辑器 调试器和编译器等 一般它包含在 Visual Studio 中 Visual Studio 包含了 VB VC C 等编译环境 当然我们在使用 VC 6 0 的时候为了 轻便 总是只单独安装 VC 6 0 但自微软 2002 年发布 Visual Studio NET 以来 微软 建立了在 NET 框架上的代码托管机制 一个项目可以支持多种语言开发的组件 VC 同 样被扩展为支持代码托管机制的开发环境 所以 NET Framework 是必须的 也就不再有 VC 的独立安装程序 不过可以在安装 Visual Studio 时只选择 VC 进行安装 VC 版本的选择 VS2010 因为 VC 6 0 以后的版本不再有独立的安装程序 所以鸡啄米在教程中将不会称 VC 6 0 以后的版本为 VC 7 0 等等 而是用 VC 所属的 Visual Studio 的版本名称代替 比如 VS2003 近些年 VC 主要的版本包括 VC 6 0 VS2003 VS2005 VS2008 和 VS2010 VC 6 0 占用的系统资源比较少 打开工程 编译运行都比较快 所以赢得很多软 件开发者的青睐 但因为它先于 C 标准推出 所以对 C 标准的支持不太好 举个例子 for int i 0 i Microsoft Visual Studio 2010 Visual Studio Tools 下 选择 Manage Help Settings ENU 弹出对话框 可以将帮助库存在默认路径 也可以修改存放路径 鸡啄米使用默认路径 点 OK 出现 选择 Install Content From Disk 后弹出对话框选择帮助所在文件 这时需要在加载 了 VS2010 的虚拟光驱中找 选择图中所示路径 点 OK 后出现如下对话框 可以点 Add 选择要添加的帮助库 鸡啄米全部添加了 点 Update 进行安装 等待其完成就可以了 使用 MSDN 时点击开始菜单的 所有程序 Microsoft Visual Studio 2010 Micro soft Visual Studio 2010 Documentation 即可 到此 VS2010 和 MSDN 的安装过程就结束了 以后就可以正式使用 VS2010 进行软 件开发了 至于 VS2010 的使用方法 在鸡啄米的 C 编程入门系列中已经介绍过 大家可 以看看 VS2010 MFC 编程入门之二 利用 MFC 向导生成单文档应用程 序框架 解决方案与工程 鸡啄米在 VS2010 的使用介绍中已经讲了解决方案与工程的概念 这里再重提一下 每个应用程序都作为一个工程来处理 它包含了头文件 源文件和资源文件等 这些文件 通过工程集中管理 在 VS2010 中 工程都是在解决方案管理之下的 一个解决方案可以 管理多个工程 可以把解决方案理解为多个有关系或者没有关系的工程的集合 VS2010 提供了一个 Solution Explorer 解决方案浏览器视图 可以显示当前解决方案的内容 当新 建一个工程时可以选择新建一个解决方案还是加入当前解决方案 下图左侧面板中正在显示的视图就是 Solution Explorer 视图中有一个解决方案 Hell oWorld 此解决方案下有一个同名的工程 HelloWorld 在应用程序向导生成应用程序后 VS2010 会在用户设置的路径下 以解决方案名为名 称建立一个目录 里面存放自动生成的文件 使用 VS2010 应用程序向导生成单文档应用程序框架 鸡啄米这里简略演示下怎样生成单文档应用程序框架 让大家先有个直观的了解 有 不理解的地方可以留着以后回来再看 下面按照操作步骤一步步讲解 1 点菜单栏 File New Project 弹出 New Project 对话框 我们可以选择工程类型 如果安装完 VS2010 以后第一启动时已经设置为 VC 则 Installed Templates Visu al C 项会默认展开 而如果没有设置 VC 则可以展开到 Installed Templates Other Languages Visual C 项 因为我们要生成的是 MFC 程序 所以在 Visual C 下选择 MFC 对话框中间区域会出现三个选项 MFC ActiveX Control MFC Application 和 M FC DLL MFC ActiveX Control 用来生成 MFC ActiveX 控件程序 MFC Application 用 来生成 MFC 应用程序 MFC DLL 用来生成 MFC 动态链接库程序 当然我们要选择 MFC Application 在对话框下部有 Name Location 和 Solution name 三个设置项 意义如下 Name 工程名 Location 解决方案路径 Solution name 解决方案名称 这里 Name 我们设为 HelloWorld Location 设置为 桌面 的路径 Solution name 默认和 Name 一样 当然可 以修改为其他名字 这里我们不作修改 也使用 HelloWorld 点 OK 按钮 2 这时会弹出 MFC Application Wizard 对话框 上部写有 Welcome to the MFC A pplication Wizard 下面显示了当前工程的默认设置 第一条 Tabbed multiple documen t interface MDI 是说此工程是多文档应用程序 如果这时直接点下面的 Finish 按钮 可 生成具有上面列出设置的多文档程序 但我们此例是要建立单文档应用程序 所以点 Next 按钮再继续设置吧 3 接下来弹出的对话框上部写有 Application Type 当然是让选择应用程序类型 我 们看到有四种类型 Single document 单文档 Multiple documents 多文档 Dialog based 基于对话框 和 Multiple top level documents 我们选择 Single document 类型 以生成一个单文档应用程序框架 单文档应用程序运行时是一个单窗口界面 此对话框的 Resource language 还提供语言的选择 这里默认选择英语 Project style 可选择工程风格 我们选择默认的 Visual Studio 风格 Use of MFC 有两个选项 Use MFC in a shared DLL 动态链接库方式使用 MFC 和 Use MFC in a static library 静态库方式使用 MFC 选择 Use MFC in a shared DLL 时 MFC 的类会以动态链接库的 方式访问 所以我们的应用程序本身就会小些 但是发布应用程序时必须同时添加必要的 动态链接库 以便在没有安装 VS2010 的机子上能够正常运行程序 选择 Use MFC in a static library 时 MFC 的类会编译到可执行文件中 所以应用程序的可执行文件要比上种方 式大 但可以单独发布 不需另加包含 MFC 类的库 这里我们使用默认的 Use MFC in a shared DLL 点 Next 按钮 4 此时弹出上部写有 Compound Document Support 的对话框 可以通过它向应用程 序加入 OLE 支持 指定 OLE 选项的复合文档类型 本例不需要 OLE 特性 使用默认值 None 点 Next 按钮 5 弹出的新对话框上部写有 Document Template Properties File extension 可以设 置程序能处理的文件的扩展名 对话框其他选项还可以更改程序窗口的标题 我们都使用 默认设置 点 Next 按钮 6 此时弹出的对话框主题是 Database Support 用于设置数据库选项 此向导可以生 成数据库应用程序需要的代码 它有四个选项 None 忽略所有的数据库支持 Header files only 只包含定义了数据库类的头文件 但不生成对应特定表的数据库类 或视图类 Database view without file support 创建对应指定表的一个数据库类和一个视图类 不附加标准文件支持 Database view with file support 创建对应指定表的一个数据库类和一个视图类 并 附加标准文件支持 本例选择默认值 None 不使用数据库特性 点 Next 按钮 7 这时弹出的对话框是关于 User Interface Features 即用户界面特性 我们可以设 置有无最大化按钮 最小化按钮 系统菜单和初始状态栏等 还可以选择使用菜单栏和工 具栏生成简单的应用程序还是使用 ribbon 这里我们都选择默认设置 点 Next 进入下一 步 8 此时弹出 高级特性 对话框 可以设置的高级特性包括有无打印和打印预览等 在 N umber of files on recent file list 项可以设置在程序界面的文件菜单下面最近打开文件的 个数 我们仍使用默认值 点 Next 按钮 9 弹出 生成类 对话框 在对话框上部的 生成类 列表框内 列出了将要生成的 4 个类 一个视图类 CHelloWorldView 一个应用类 CHelloWorldApp 一个文档类 CHel loWorldDoc 和一个主框架窗口类 CMainFrame 在对话框下面的几个编辑框中 可以 修改默认的类名 类的头文件名和源文件名 对于视图类 还可以修改其基类名称 默认 的基类是 CView 还有其他几个基类可以选择 这里我们还是使用默认设置 点 Finish 按 钮 应用程序向导最后为我们生成了应用程序框架 并在 Solution Explorer 中自动打开了 解决方案 见上面第一张图 编译运行生成的程序 点菜单中的 Build Build HelloWorld 编译程序 然后点 Debug Start Without Debu gging 快捷键 Ctrl F5 运行程序 也可以直接点 Debug Start Without Debugging 这 时会弹出对话框提示是否编译 选择 Yes VS2010 将自动编译链接运行 HelloWorld 程 序 结果页面如下所示 终于看见界面了 鸡啄米在以后的教程中会继续讲解各种界面和控件的使用方法 欢 迎到鸡啄米博客交流 您的关注是我前进的动力 VS2010 MFC 编程入门之三 VS2010 应用程序工程中文件的组 成结构 鸡啄米在上一讲中为大家演示了如何利用应用程序向导创建单文档应用程序框架 这 一节将以上一讲中生成应用程序 HelloWorld 的文件结构为例 讲解 VS2010 应用程序工程 中文件的组成结构 用应用程序向导生成框架程序后 我们可以在之前设置的 Location 下看到以解决方案 名命名的文件夹 此文件夹中包含了几个文件和一个以工程名命名的子文件夹 这个子文 件夹中又包含了若干个文件和一个 res 文件夹 创建工程时的选项不同 工程文件夹下的 文件可能也会有所不同 如果已经以 Debug 方式编译链接过程序 则会在解决方案文件夹下和工程子文件夹下 各有一个名为 Debug 的文件夹 而如果是 Release 方式编译则会有名为 Release 的文件 夹 这两种编译方式将产生两种不同版本的可执行程序 Debug 版本和 Release 版本 D ebug 版本的可执行文件中包含了用于调试的信息和代码 而 Release 版本则没有调试信 息 不能进行调试 但可执行文件比较小 鸡啄米将所有文件分为 6 个部分 解决方案相关文件 工程相关文件 应用程序头文 件和源文件 资源文件 预编译头文件和编译链接生成文件 1 解决方案相关文件 解决方案相关文件包括解决方案文件夹下的 sdf 文件 sln 文件 suo 文件和 ipch 文 件夹 sdf 文件和 ipch 目录一般占用空间比较大 几十兆甚至上百兆 与智能提示 错误提 示 代码恢复和团队本地仓库等相关 如果你觉得不需要则可以设置不生成它们 方法是 点击菜单栏 Tools Options 弹出 Options 对话框 选择左侧面板中 Text Editor C C A dvanced 右侧列表中第一项 Disable Database 由 False 改为 True 就可以了 最后关闭 VS2010 再删除 sdf 文件和 ipch 目录以后就不会再产生了 但关闭此选项以后也会有很多 不便 例如写程序时的智能提示没有了 sln 文件和 suo 文件为 MFC 自动生成的解决方案文件 它包含当前解决方案中的工 程信息 存储解决方案的设置 2 工程相关文件 工程相关文件包括工程文件夹下的 vcxproj 文件和 vcxproj filters 文件 vcxproj 文件是 MFC 生成的工程文件 它包含当前工程的设置和工程所包含的文件等 信息 vcxproj filters 文件存放工程的虚拟目录信息 也就是在解决方案浏览器中的目录结 构信息 3 应用程序头文件和源文件 应用程序向导会根据应用程序的类型 单文档 多文档或基于对话框的程序 自动生 成一些头文件和源文件 这些文件是工程的主体部分 用于实现主框架 文档 视图等 鸡啄米下面分别简单介绍下各个文件 HelloWorld h 应用程序的主头文件 主要包含由 CWinAppEx 类派生的 CHelloWorld App 类的声明 以及 CHelloWorldApp 类的全局对象 theApp 的声明 HelloWorld cpp 应用程序的主源文件 主要包含 CHelloWorldApp 类的实现 CHell oWorldApp 类的全局对象 theApp 的定义等 MainFrm h 和 MainFrm cpp 通过这两个文件从 CFrameWndEx 类派生出 CMainFra me 类 用于创建主框架 菜单栏 工具栏和状态栏等 HelloWorldDoc h 和 HelloWorldDoc cpp 这两个文件从 CDocument 类派生出文档类 CHelloWorldDoc 包含一些用来初始化文档 串行化 保存和装入 文档和调试的成员函 数 HelloWorldView h 和 HelloWorldView cpp 它们从 CView 类派生出名为 CHelloWorl dView 的视图类 用来显示和打印文档数据 包含了一些绘图和用于调试的成员函数 ClassView h 和 ClassView cpp 由 CDockablePane 类派生出 CClassView 类 用于 实现应用程序界面左侧面板上的 Class View FileView h 和 FileView cpp 由 CDockablePane 类派生出 CFileView 类 用于实现应 用程序界面左侧面板上的 File View OutputWnd h 和 OutputWnd cpp 由 CDockablePane 类派生出 COutputWnd 类 用 于实现应用程序界面下侧面板 Output PropertiesWnd h 和 PropertiesWnd cpp 由 CDockablePane 类派生出 CProperties Wnd 类 用于实现应用程序界面右侧面板 Properties ViewTree h 和 ViewTree cpp 由 CTreeCtrl 类派生出 CViewTree 类 用于实现出现 在 ClassView 和 FileView 等中的树视图 4 资源文件 一般我们使用 MFC 生成窗口程序都会有对话框 图标 菜单等资源 应用程序向导 会生成资源相关文件 res 目录 HelloWorld rc 文件和 Resource h 文件 res 目录 工程文件夹下的 res 目录中含有应用程序默认图标 工具栏使用图标等图 标文件 HelloWorld rc 包含默认菜单定义 字符串表和加速键表 指定了默认的 About 对话 框和应用程序默认图标文件等 Resource h 含有各种资源的 ID 定义 5 预编译头文件 几乎所有的 MFC 程序的文件都要包含 afxwin h 等文件 如果每次都编译一次则会大 大减慢编译速度 所以把常用的 MFC 头文件都放到了 stdafx h 文件中 然后由 stdafx cpp 包含 stdafx h 文件 编译器对 stdafx cpp 只编译一次 并生成编译之后的预编译头 HelloW orld pch 大大提高了编译效率 6 编译链接生成文件 如果是 Debug 方式编译 则会在解决方案文件夹和工程文件夹下都生成 Debug 子文 件夹 而如果是 Release 方式编译则生成 Release 子文件夹 工程文件夹下的 Debug 或 Release 子文件夹中包含了编译链接时产生的中间文件 解决方案文件夹下的 Debug 或 Release 子文件夹中主要包含有应用程序的可执行文件 关于应用程序工程文件的组成结构鸡啄米就先讲到这了 其中包含了很多专有名词 以后大家会慢慢熟悉的 欢迎来鸡啄米博客交流 谢谢 VS2010 MFC 编程入门之四 MFC 应用程序框架分析 上一讲鸡啄米讲的是 VS2010 应用程序工程中文件的组成结构 可能大家对工程的运 行原理还是很模糊 理不出头绪 毕竟跟 C 编程入门系列中的例程差别太大 这一节鸡 啄米就为大家分析下 MFC 应用程序框架的运行流程 一 SDK 应用程序与 MFC 应用程序运行过程的对比 程序运行都要有入口函数 在之前的 C 教程中都是 main 函数 而 Windows 应用程 序的入口函数是 WinMain 函数 MFC 程序也是从 WinMain 函数开始的 下面鸡啄米就给 出用 Windows SDK 写的 HelloWorld 程序 与应用程序框架进行对比 这样能更好的了解 框架是怎样运行的 Windows SDK 开发程序就是不使用 MFC 类库 直接用 Windows AP I 函数进行软件开发 鸡啄米不是要讲解 SDK 开发 只是为了对比而简单介绍 至于 SDK 开发可以在大家学完 MFC 以后选择是否要研究 一般来说有简单了解就可以了 SDK 应用程序 首先 给出 Windows SDK 应用程序 HelloWorld 的源码 C 代码 1 include 2 3 LRESULT CALLBACK myWndProc HWND hWindow UINT msg WPARAM wPara m LPARAM lParam 4 5 int WINAPI WinMain HINSTANCE hInstance HINSTANCE hPrevInstance PSTR szCmdLine int iCmdShow 6 7 const static TCHAR appName TEXT Hello world 8 WNDCLASSEX myWin 9 myWin cbSize sizeof myWin 10 myWin style CS HREDRAW CS VREDRAW 11 myWin lpfnWndProc myWndProc 12 myWin cbClsExtra 0 13 myWin cbWndExtra 0 14 myWin hInstance hInstance 15 myWin hIcon 0 16 myWin hIconSm 0 17 myWin hCursor 0 18 myWin hbrBackground HBRUSH COLOR WINDOW 1 19 myWin lpszMenuName 0 20 myWin lpszClassName appName 21 Register 22 if RegisterClassEx 23 const HWND hWindow CreateWindow 24 appName 25 appName 26 WS OVERLAPPEDWINDOW 27 CW USEDEFAULT 28 CW USEDEFAULT 29 CW USEDEFAULT 30 CW USEDEFAULT 31 0 32 0 33 hInstance 34 0 35 ShowWindow hWindow iCmdShow 36 UpdateWindow hWindow 37 38 MSG msg 39 while GetMessage 42 DispatchMessage 43 44 return int msg wParam 45 46 47 48 LRESULT CALLBACK myWndProc HWND hWindow UINT msg WPARAM wPara m LPARAM lParam 49 50 if msg WM PAINT 51 52 PAINTSTRUCT ps 53 const HDC hDC BeginPaint hWindow 54 RECT rect 55 GetClientRect hWindow 56 DrawText hDC TEXT HELLO WORLD 1 57 EndPaint hWindow 58 return 0 59 60 else if msg WM DESTROY 61 62 PostQuitMessage 0 63 return 0 64 65 return DefWindowProc hWindow msg wParam lParam 66 上面的程序运行的流程是 进入 WinMain 函数 初始化 WNDCLASSEX 调用 Regis terClassEx 函数注册窗口类 调用 ShowWindow 和 UpdateWindow 函数显示并更新窗口 进 入消息循环 关于消息循环再简单说下 Windows 应用程序是消息驱动的 系统或用户让 应用程序进行某项操作或完成某个任务时会发送消息 进入程序的消息队列 然后消息循 环会将消息队列中的消息取出 交予相应的窗口过程处理 此程序的窗口过程函数就是 m yWndProc 函数 窗口过程函数处理完消息就完成了某项操作或任务 本例是要显示 HEL LO WORLD 字符串 UpdateWindow 函数会发送 WM PAINT 消息 但是此消息不经过 消息队列而是直接送到窗口过程处理 在窗口过程函数中最终绘制了 HELLO WORLD 字 符串 MFC 应用程序 下面是 MFC 应用程序的运行流程 通过 MFC 库中代码进行分析 首先在 HelloWorld cpp 中定义全局对象 theApp CHelloWorldApp theApp 调用 C WinApp 和 CHelloWorldApp 的构造函数后 进入 WinMain 函数 位于 appmodul cpp 中 C 代码 1 extern C int WINAPI 2 tWinMain HINSTANCE hInstance HINSTANCE hPrevInstance 3 In LPTSTR lpCmdLine int nCmdShow 4 pragma warning suppress 4985 5 6 call shared exported WinMain 7 return AfxWinMain hInstance hPrevInstance lpCmdLine nCmd Show 8 在 TCHAR h 中 有此定义 define tWinMain WinMain 所以这里的 tWinMain 就是 WinMain 函数 它调用了 AfxWinMain 函数 位于 WinMain cpp 中 C 代码 1 int AFXAPI AfxWinMain HINSTANCE hInstance HINSTANCE hPrevInsta nce LPTSTR lpCmdLine int nCmdShow 2 3 略 4 App global initializations rare 5 if pApp NULL 7 8 if pThread InitInstance 9 10 略 11 12 13 Run 函数位于 THRDCORE cpp 中 由此函数进入消息循环 14 nReturnCode pThread Run 15 16 略 17 18 return nReturnCode 19 上面 InitInstance 函数的代码如下 C 代码 1 BOOL CTestApp InitInstance 2 3 略 4 CSingleDocTemplate pDocTemplate 5 pDocTemplate new CSingleDocTemplate 6 IDR MAINFRAME 7 RUNTIME CLASS CTestDoc 8 RUNTIME CLASS CMainFrame main SDI frame window 9 RUNTIME CLASS CTestView 10 if pDocTemplate 11 return FALSE 12 AddDocTemplate pDocTemplate 13 Parse command line for standard shell commands DDE file open 14 15 CCommandLineInfo cmdInfo 16 ParseCommandLine cmdInfo 17 18 ProcessShellCommand 位于 AppUI2 cpp 中 注册并创建窗口 19 if ProcessShellCommand cmdInfo 20 return FALSE 21 22 m pMainWnd ShowWindow SW SHOW 23 m pMainWnd UpdateWindow 24 25 return TRUE 26 InitInstance 中的 ProcessShellCommand 函数又调用了 CMainFrame 的 LoadFrame 函数注册并创建了窗口 执行完 ProcessShellCommand 函数以后 调用了 m pMainWnd 的 ShowWindow 和 UpdateWindow 函数显示并更新框架窗口 这些是不是与上面的 SDK 程序十分类似 接下来该是消息循环了 上面的 AfxWinMain 函数中调用了 pThread 的 Run 函数 位 于 THRDCORE cpp 中 在 Run 中包含了消息循环 Run 函数的代码如下 C 代码 1 int CWinThread Run 2 3 略 4 phase2 pump messages while available 5 do 6 7 pump message but quit on WM QUIT 8 if PumpMessage 9 return ExitInstance 10 11 reset no idle state after pumping normal m essage 12 if IsIdleMessage 15 16 lIdleCount 0 17 18 19 while PeekMessage 20 略 21 22 23 BOOL CWinThread PumpMessage 24 25 return AfxInternalPumpMessage 26 27 28 BOOL AFXAPI AfxInternalPumpMessage 29 30 AFX THREAD STATE pState AfxGetThreadState 31 32 if GetMessage 40 DispatchMessage 41 42 43 return TRUE 44 我们看到 PumpMessage 中通过调用 GetMessage TranslateMessage DispatchMe ssage 等建立了消息循环并投递消息 窗口过程函数 AfxWinProc 形式如下 C 代码 1 LRESULT CALLBACK AfxWndProc HWND hWnd UINT nMsg WPARAM wParam LPARAM lParam 2 3 4 CWnd pWnd CWnd FromHandlePermanent hWnd 5 ReturnAfxCallWndProc pWnd hWnd nMsg wParam lParam 6 两者运行过程对比 到此 通过对比可以发现 MFC 应用程序的运行流程与 SDK 程序是类似的 都是先 进行一些初始化过程 再注册并创建窗口 然后显示 更新窗口 最后进入消息循环 消 息都由窗口过程函数处理 现在大家是不是觉得有些头绪了 在运行流程上有基本的掌握 即可 二 MFC 应用程序框架主要类之间的关系 在第二讲中 给大家演示了如何利用应用程序向导生成单文档应用程序框架 可以看 到程序的基本框架和必要的代码都自动生成了 上一讲又讲解了文件组成结构 实际上在 前面自动生成的框架中比较重要的类包括以下几个 CHelloWorldApp CMainFrame C HelloWorldDoc 和 CHelloWorldView 至于其他的类比如 CClassView CFileView 等都是 在框架窗口 CMainFrame 上创建的面板等 不是必要的 鸡啄米就四个主要类的关系简单讲下 CHelloWorldApp 类处理消息 将收到的消息 分发给相应的对象 CMainFrame 是视图 CHelloWorldView 的父窗口 视图 CHelloWorld View 就显示在 CMainFrame 的客户区中 视图类 CHelloWorldView 用来显示文档类 CHel loWorldDoc 中的数据 并根据对视图类的操作修改文档类的数据 一个视图类只能跟一个 文档类相联系 而一个文档类可以跟多个视图类相联系 关于视图类和文档类的关系后面 会详细讲解 本节 VC MFC 编程入门教程内容比较多 主要是让大家对 MFC 应用程序的运行原 理有大概的了解 对于以后的 MFC 开发有很多好处 如果有问题请在鸡啄米博客留言交 流 谢谢 VS2010 MFC 编程入门之五 MFC 消息映射机制概述 上一讲鸡啄米为大家简单分析了 MFC 应用程序框架 这一讲是关于 MFC 消息映射机 制的内容 前面已经说过 Windows 应用程序是消息驱动的 在 MFC 软件开发中 界面操作或 者线程之间通信都会经常用到消息 通过对消息的处理实现相应的操作 比较典型的过程 是 用户操作窗口 然后有消息产生 送给窗口的消息处理函数处理 对用户的操作做出 响应 什么是消息 窗口消息一般由三个部分组成 1 一个无符号整数 是消息值 2 消息附带的 WPAR AM 类型的参数 3 消息附带的 LPARAM 类型的参数 其实我们一般所说的消息是狭义 上的消息值 也就是一个无符号整数 经常被定义为宏 什么是消息映射机制 MFC 使用一种消息映射机制来处理消息 在应用程序框架中的表现就是一个消息与消 息处理函数一一对应的消息映射表 以及消息处理函数的声明和实现等代码 当窗口接收 到消息时 会到消息映射表中查找该消息对应的消息处理函数 然后由消息处理函数进行 相应的处理 SDK 编程时需要在窗口过程中一一判断消息值进行相应的处理 相比之下 M FC 的消息映射机制要方便好用的多 Windows 消息分类 先讲下 Windows 消息的分类 Windows 消息分为系统消息和用户自定义消息 Wind ows 系统消息有三种 1 标准 Windows 消息 除 WM COMMAND 外以 WM 开头的消息是标准消息 例如 WM CREATE WM CLOSE 2 命令消息 消息名为 WM COMMAND 消息中附带了标识符 ID 来区分是来自哪个 菜单 工具栏按钮或加速键的消息 3 通知消息 通知消息一般由列表框等子窗口发送给父窗口 消息名也是 WM COM MAND 其中附带了控件通知码来区分控件 CWnd 的派生类都可以接收到标准 Windows 消息 通知消息和命令消息 命令消息还 可以由文档类等接收 用户自定义消息是实际上就是用户定义一个宏作为消息 此宏的值应该大于等于 WM USER 然后此宏就可以跟系统消息一样使用 窗口类中可以定义它的处理函数 消息映射表 除了一些没有基类的类或 CObject 的直接派生类外 其他的类都可以自动生成消息映 射表 下面的讲解都以前面例程 HelloWorld 的 CMainFrame 为例 消息映射表如下 C 代码 1 BEGIN MESSAGE MAP CMainFrame CFrameWndEx 2 ON WM CREATE 3 ON COMMAND ID VIEW CUSTOMIZE 2 在类的消息映射表中添加该消息的消息映射入口项 例如 WM CREATE 的消息映 射入口项 ON WM CREATE 3 在类实现中添加消息处理函数的函数实现 例如 MainFrm cpp 中 WM CREATE 的消息处理函数的实现 int CMainFrame OnCreate LPCREATESTRUCT lpCreateStruct 通过以上三个步骤以后 WM CREATE 等消息就可以在窗口类中被消息处理函数处 理了 各种 Windows 消息的消息处理函数 标准 Windows 消息的消息处理函数都与 WM CREATE 消息类似 命令消息的消息映射入口项形式如 ON COMMAND ID VIEW CUSTOMIZE 参数 id 为用户操作的菜单项等的 ID 在操作列表框等控件时往往会给父窗口发送 WM NOTIFY 通知消息 WM NOTIFY 消息的 wParam 参数为发送通知消息的控件的 ID lParam 参数指向一个结构体 可能是 NMHDR 结构体 也可能是第一个元素为 NMHDR 结构体变量的其他结构体 NMHDR 结 构体的定义如下 仅作了解 Typedef sturct tagNMHDR HWND hwndFrom UINT idFrom UINT code NMHDR hwndFrom 为发送通知消息控件的句柄 idFrom 为控件 ID code 为要处理的通知消 息的通知码 例如 NM CLICK 通知消息的消息映射入口项形式如 ON NOTIFY wNotifyCode id memberFxn wNotifyCode 为要处理的通知消息通知码 例如 NM CLICK id 为控件标识 ID M emberFxn 为此消息的处理函数 通知消息的处理函数的原型为 afx msg void memberFxn NMHDR pNotifyStruct LRESULT result 如果需要使用用户自定义消息 首先要定义消息宏 如 define WM UPDATE WN D WM USER 1 再到消息映射表中添加消息映射入口项 ON MESSAGE WM UPDA TE WND 最后在 MainFrm cpp 中实现此函数 鸡啄米本节对 MFC 消息映射机制只是做了比较简单的讲解 让大家对它有一定的认 识 编程入门者不必强求完全掌握 在以后的教程中会经常涉及到消息的使用 大家会逐 渐熟悉 MFC 的消息映射机制 VS2010 MFC 编程入门之六 对话框 创建对话框模板和修改对 话框属性 鸡啄米在上一讲中介绍了 MFC 的消息映射机制 属于原理方面的知识 对于 VC 编 程入门学习者来说可能有些抽象 鸡啄米会把消息映射的知识渗透到后面的教程中 本节 开始为大家讲解偏应用的知识 创建对话框 对话框 大家应该很熟悉了 在我们常用的软件中大多都有对话框界面 例如 360 安全卫士的主界面其实就是个对话框 只是它做了很多美工方面的工作 将其大大美化了 创建对话框主要分两大步 第一 创建对话框资源 主要包括创建新的对话框模板 设置对话框属性和为对话框添加各种控件 第二 生成对话框类 主要包括新建对话框类 添加控件变量和控件的消息处理函数等 鸡啄米在本节中先讲讲怎样创建对话框模板和 设置对话框属性 创建基于对话框的应用程序框架 之前鸡啄米创建的 HelloWorld 程序是单文档应用程序 生成了多种窗口 如果用它来 将讲创建对话框的话可能有些复杂 对大家单纯理解对话框有点影响 所以这里鸡啄米就 再创建一个基于对话框的应用程序 用来实现加法运算的功能 创建步骤同单文档应用程 序大同小异 简单步骤如下 1 选择菜单项 File New Project 弹出 New Project 对话框 2 左侧面板中 Installed Templated 的 Visual C 下选择 MFC 中间窗口中选择 MFC Application 然后在下面的 Name 编辑框中键入工程名称 本例取名 Addition 在 Locati on 编辑框中设置工程的保存路径 点 OK 3 点 Next 到 Application Type 对话框 在 Application type 下选择 Dialog based 其他使用默认设置 点 Finish 我们可以在 Solution Explorer 视图中看到 此工程的文件要比单文档应用程序少的多 在 Class View 中主要有三个类 CAboutDlg CAdditionApp 和 CAdditionDlg CAbout Dlg 是应用程序的 关于 对话框类 CAdditionApp 是由 CWinApp 派生的类 CAdditionDlg 是主对话框类 主对话框也就是此应用程序运行后显示的主要界面 注 如果在 VS2010 中找不到 Solution Explorer 或 Class View 等视图 可以在菜单 项 View 下找到对应视图选项选择即可 在 VS2010 的使用介绍中已经有讲解 在 Resource View 视图中可以看到工程 Addition 的资源树 展开 Addition rc 下面有 四个子项 Dialog 对话框 Icon 图标 String Table 字符串表 和 Version 版本 然后展开 Dialog 项 下面有两个对话框模板 其 ID 分别为 IDD ABOUTBOX 和 IDD ADDITION DIALOG 前者是 关于 对话框的模板 后者是主对话框的模板 ID 是资源的 唯一标识 本质上是一个无符号整数 一般 ID 代表的整数值由系统定义 我们无需干涉 对话框模板 可见对于主对话框来说 创建对话框第一步中的创建新的对话框模板已经由系统自动 完成了 而如果是再添加对话框需要创建新的对话框模板时 需要在 Resource View 的 D ialog 节点上点右键 在右键菜单中选择 Insert Dialog 就会生成新的对话框模板 并且 会自动分配 ID 在 Resource View 的资源树中双击某个 ID 可在中间区域内显示相应的资源界面 双击 IDD ADDITION DIALOG 时 中间区域就会显示 Addition 对话框模板 如下图 设置对话框属性 在 Addition 对话框模板上点右键 然后在右键菜单中选择 Properties 则在右侧面板 中会显示对话框的属性列表 如下图 鸡啄米在这里对经常使用的几个属性作简单说明 并对 Addition 对话框进行属性设置 说明 1 ID 对话框 ID 唯一标识对话框资源 可以修改 此处为 IDD ADDITION DIALO G 我们不修改它 2 Caption 对话框标题 此处默认为 Addition 我们将其修改为 加法计算器 3 Border 边框类型 有四种类型 None Thin Resizing 和 Dialog Frame 我们 使用默认的 Dialog Frame 4 Maximize 是否使用最大化按钮 我们使用默认的 False 5 Minimize 是否使用最小化按钮 同样我们使用默认的 False 6 Style 对话框类型 有三种类型 Overlapped 重叠窗口 Popup 弹出式窗口 和 Child 子窗口 弹出式窗口比较常见 我们使用默认的 Popup 类型 7 System Menu 是否带有标题栏左上角的系统菜单 包括移动 关闭等菜单项 我 们使用默认的 True 8 Title Bar 是否带有标题栏 我们使用默认的 True 9 Font Size 字体类型和字体大小 如果将其修改为非系统字体 则 Use System 自 动改为 False 而如果 Use System 原来为 False 将其修改为 True 则 Font Size 自动设 置为系统字体 这里我们使用默认的系统字体 根据以上说明 其实我们只修改了标题属性 这时我们运行此程序后的界面如下 这一讲就先讲到这里了 对于创建对话框第一步中的为对话框添加各种控件下一讲为 大家演示 欢迎来鸡啄米博客交流学习 VS2010 MFC 编程入门之七 对话框 为对话框添加控件 创建对话框资源需要创建对话框模板 修改对话框属性 为对话框添加各种控件等步 骤 前面一讲中鸡啄米已经讲了创建对话框模板和修改对话框属性 本节继续讲如何为对 话框添加控件 上一讲中鸡啄米创建了一个名为 Addition
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!