• 1. 第十讲 Windows基本应用程序的建立严宣辉 数学与计算机科学学院 E-mail:yanxuanhui@fjnu.edu.cn1
  • 2. 教学提纲一、教学内容: Windows编程基础知识 Windows应用程序的基本结构和工作原理 二、学时:两课时 三、教学目的和要求 了解VC++ 6.0开发环境的详细使用方法 掌握Windows基本数据类型、句柄和消息等概念 掌握Windows应用程序的基本结构和工作原理 四、教学重点和难点 重点: Windows应用程序的基本结构和工作原理 难点:消息机制2
  • 3. 四. 教学过程提要Visual C++集成开发环境的使用: 莱单、工具栏、资源编辑器 (课堂简单讲解,学生自己课后参看PPT上机练习) Windows编程基础知识: 基本数据类型、句柄和消息 简单Windows应用程序的结构和工作流程 3
  • 4. 4.1 Visual C++集成开发环境的使用 4.2 Windows编程基础知识 4.3 简单的Windows应用程序的结构和工作流程 总结、练习题内容提要第四章 Windows应用程序的建立4
  • 5. §4.1 VC++集成开发环境的使用1、 集成开发环境的启动及其主窗口简介 Visual C++ 6.0提供了良好的可视化编程环境,集项目建立、打开、浏览、编辑、保存、编译、连接和调试等功能于一体。 如图4.1所示。 4.1.1 Visual C++集成开发环境5
  • 6. 图4.1 Visual C++ 6.0 的Developer Studio4.1.1 Visual C++集成开发环境26
  • 7. 图4.1为集成开发环境的主窗口,包括标题栏、菜单栏、项目工作区窗口(缺省时处于泊坞状态)、正文窗口、输出窗口(缺省时处于泊坞状态)和状态条。标题栏用于显示应用程序名和打开的文件名;菜单栏完成Developer Studio中的所有功能;工具栏对应于某些菜单或命令的功能,简化用户操作;项目工作区(Workspace)窗口用于组织文件、项目和项目配置。当读进一个项目后,该窗口的下端会出现3个标签:类视图(ClassView)、资源视图(ResourceView)及文件视图(FileView);正文窗口用于各种程序文件、资源文件、文档文件以及帮助信息等显示或编辑;输出窗口用于显示项目建立过程中所产生的各种信息;状态栏给出当前操作或所选择的命令的提示信息。 4.1.1 Visual C++集成开发环境37
  • 8. 2、正文窗口及其操作 用户可以同时打开多个正文窗口,每个窗口都是标准的Window窗口,可通过系统菜单以及右上角的最大化、最小化、复原、关闭、移动及改变尺寸等进行一般的操作。除此之外,还有以下两种方法可切换窗口。 (1) 若需要切换的窗口已打开且可见,用鼠标单击该窗口的任何部分, 或在Window菜单下选择最下面的文件列表中的相应文件即可将其激活。 (2) 若需要切换的窗口已打开但不可见,可以使用正文窗口系统菜单下的Next命令(或加速键Ctrl+F6)依次循环地切换正文窗口,也可以使用Window菜单下的Windows命令,将出现如图4.2所示的对话框。4.1.1 Visual C++集成开发环境48
  • 9. 图4.2 Windows对话框4.1.1 Visual C++集成开发环境59
  • 10. 在Select window下面的列表框中列出当前打开的正文窗口,可让用户选择。右边的Activate按钮用来激活选中的窗口。Close Window(s)按钮用来关闭选定的窗口。当选定的窗口是程序文件或用户可以编辑的其它文档文件时,也可用Save按钮来保存文件。 4.1.1 Visual C++集成开发环境610
  • 11. 3、Workspace窗口及其操作 在图4.3中单击不同标签就会显示相应的页面。例如单击FileView图标标签,会出现图4.3所示的页面。页面中的内容是以树型结构显示的。通过单击某结点前的“+”或双击该结点,就可以打开该结点,显示其内容。如果双击结点为最底层的对象,则打开相应的编辑器,出现一个编辑窗口。例如,在FileView中双击文本文件,会打开源程序编辑器;在ResourceView中双击一个资源时,会打开资源编辑器。4.1.1 Visual C++集成开发环境711
  • 12. 图4.3 Workspace窗口的外观4.1.1 Visual C++集成开发环境812
  • 13. 可以通过按Shift+Esc键或单击工具栏中的Workspace按钮隐藏Workspace窗口,也可以用鼠标右击Workspace窗口的页面,然后从快捷菜单中选中Hide命令;或是用鼠标右击任意工具栏的边框,弹出快捷菜单,然后选取Project Workspace菜单项。 Workspace窗口被隐藏后,可以单击工具栏中的Workspace按钮,或者从View菜单下选取Workspace菜单项或按Alt+0加速键将其显示出来;也可以用鼠标右击任意工具栏的边框,弹出快捷菜单,然后选取Project Workspace菜单项。4.1.1 Visual C++集成开发环境913
  • 14. 4.1.2 菜单功能介绍14.1.2 菜单功能介绍 Visual C++ 6.0的菜单栏包括File、Edit、View、Insert、Project、Build、Tools、Window、Help等菜单,使用方法与Windows常规操作相同。 在窗口的不同位置单击鼠标右键,可以弹出快捷菜单,该菜 单中的选项通常都是与当前位置关系密切,需要频繁执行的操作命令。14
  • 15. 1、File菜单 File菜单中的命令主要完成文件的建立、保存、打开、关闭以及打印等工作。菜单命令项及其加速键和功能如表4.1所示。 4.1.2 菜单功能介绍215
  • 16. 表4.1 File菜单命令的加速键及功能菜单命令 加速键 功 能说明 New Ctrl+N 创建一个新文件、工程 Open Ctrl+O 打开一个已存在的文件 Close 关闭当前被打开的文件 Open Workspace 打开一个已存在的Workspace Save Workspace 保存当前被打开的Workspace Close Workspace 关闭当前被打开的Workspace Sa Ctrl+S 保存当前文件 Save As 以新的文件名保存当前文件 Save All 保存所有打开的文件 Page Setup 设置文件的页面 Print Ctrl+P 打印文件的全部或选定的部分 Recent Files 最近的文件列表 Recent Workspace 最近的Workspace列表 Exit 退出集成开发环境4.1.2 菜单功能介绍316
  • 17. 2、Edit菜单 Edit菜单中的命令用来使用户便捷地编辑文件,如进行删除、复制等操作。菜单命令项及其加速键和功能如表4.2所示。4.1.2 菜单功能介绍417
  • 18. 菜单命令 加速键 功 能 说 明 Undo Ctrl+Z 撤消上一次编辑操作 Redo Ctrl+Y 恢复被取消的编辑操作 Cut Ctrl+X 将选定的文本剪切到剪贴板中 Copy Ctrl+C 将选定的文本复制到剪贴板中 Paste Ctrl+V 将剪切板中的内容粘贴到光标处 Delete Del 删除选定的对象或光标处的字符 Select All Ctrl+A 一次性选定窗口中的全部内容 Find Ctrl+F 查找指定的字符串 Find in Files 在多个文件中查找指定的字符串 4.1.2 菜单功能介绍518
  • 19. Replace Ctrl+H 替换指定的字符串 Go To Ctrl+G 光标自动转移到指定位置 Bookmarks Ctrl+F2 给文本加书签 Advanced\Incremental Search Ctrl+I 开始向前搜索 Advanced\Format Selection Alt+F8 对选中对象进行快速缩排 Advanced\Tabify Selection 在选中对象中用跳格代替空格 Advanced\Untabify Selection 在选中对象中用空格代替跳格 Advanced\Mak Selection Uppercase Ctrl+Shift+U 把选中部分改成大写续表(2)4.1.2 菜单功能介绍619
  • 20. Advanced\Make Selection Lowercase Ctrl+U 把选中部分改成小写 Advanced\a-b View Whitespace Ctrl+Shift+8 显示或隐藏空格点 Breakpoints Alt+F9 编辑程序中的断点 List Members Ctrl+Alt+T 列出全部成员 Type Info Ctrl+T 显示变量、函数或方法的语法 Parameter Info Ctrl+Shift+Space 显示函数的参数 Complete Word Ctrl+Space 给出相关关键字的全称 续表(3)4.1.2 菜单功能介绍720
  • 21. 3、View菜单 View菜单中的命令主要用来改变窗口的显示方式,激活调试时所用的各个窗口。菜单命令项及其加速键和功能如表4.3所示。 4.1.2 菜单功能介绍821
  • 22. 表4.3 View菜单命令的加速键及功能菜 单 命 令 加速键 功 能 说 明 Class Wizard Ctrl+W 编辑应用程序中的类 Resource Symbols 浏览和编辑资源文件中的符号 Resource Includes 编辑修改资源文件名及预处理指令 Full Screen 切换窗口的全屏幕方式和正常方式 Workspace Alt+0 激活Workspace窗口 Output Alt+2 激活Output窗口 Debug Windows\Watch Alt+3 激活Watch窗口 Debug Windows\Call Stack Alt+7 激活Call Stack窗口 Debug Windows\Memory Alt+6 激活Memory窗口 Debug Windows\Variables Alt+4 激活Variables窗口 Debug Windows\Registers Alt+5 激活Registers窗口 Debug Windows\Disassembly Alt+8 激活Disassembly窗口 Refresh 更新选择域 Properties Alt+Enter 编辑当前被选中对象的属性4.1.2 菜单功能介绍922
  • 23. 4、Insert菜单 Insert菜单中的命令主要用于项目、文件及资源的创建和添加。菜单命令项及其加速键和功能如表4.4所示。4.1.2 菜单功能介绍1023
  • 24. 表4.4 Inset菜单命令的加速键及功能菜 单 命 令 加 速 键 功 能 说 明 New Class 创建新类并加入到项目中 New Form 创建新表单并加入到项目中 Resource Ctrl+R 创建各种新资源 Resource Copy 对选定的资源进行拷贝 File As Text 在当前源文件中插入一个文件 New ALT Object 在项目中增加一个ALT对象4.1.2 菜单功能介绍1124
  • 25. 5、Project菜单 Project菜单中的命令主要用来对项目进行文件的添加工作。菜单命令项及其加速键和功能如表4.5所示。4.1.2 菜单功能介绍1225
  • 26. 表4.5 Project菜单命令的加速键及功能菜 单 命 令 加速键 功 能 说 明 Set Active Project 激活项目 Add To project\New 在项目上增加新文件 Add To project\New Folder 在项目上增加新文件夹 Add To project\Files 在项目上插入已存在的文件 Add To project\Data Connection 在当前项目上增加数据连接 Add To project\Components and Controls 在当前项目上插入库中的组件 Dependencies 编辑项目组件 Settings Alt+F7 编辑项目编译及调试的设置 Export Makefile 以Makefile形式输出可编译项目 Insert Project into Workspace 将项目插入Workspace窗口中4.1.2 菜单功能介绍1326
  • 27. 6、Build菜单 Build菜单中的命令主要用来进行应用程序的编译、连接、调试和运行等。菜单命令项及其加速键和功能如表4.6所示。 4.1.2 菜单功能介绍1427
  • 28. 表4.6 Build命令的加速键及功能菜 单 命 令 加速键 功 能 说 明 Compile xxx.cpp Ctrl+F7 编译C或C++源代码文件 Build yy.exe F7 编译和连接项目 Rebuild All 编译和连接项目及资源 Batch Build 一次编译和连接多个项目 Clean 删除中间及输出文件 Start Debug\Go F5 开始或继续调试程序 Start Debug\Step Into F11 单步运行调试 Start Debug\Run to Cursor Ctrl+F10 运行程序到光标所在行 Start Debug\Attach to Process 连接到正在运行的进程 Debugger Remote Connection 编辑远程调试连接设置 Execute xx.exe Ctrl+F5 运行程序 Set Active Configuration 选择激活的项目及配置 Configurations 编辑项目的配置 Profile 设置Profile选项,显示Profile数据 4.1.2 菜单功能介绍1528
  • 29. 7、Tools菜单 Tools菜单中的命令主要用于选择或定制集成开发环境中的一些实用工具,来改变窗口的显示方式,激活调试所用的各个窗口。菜单命令项及其加速键和功能如表4.7所示。 4.1.2 菜单功能介绍1629
  • 30. 表4.7 Tools菜单命令的加速键及功能菜 单 命 令 加速键 功 能 说 明 Source Browser Alt+F12 在选定的对象或当前文本中查询 Close Source Browser File 关闭信息库 Visual Component Manager 激活Visual Component Manager Register Control 激活Register Control Error Lookup 激活Error Lookup ActiveX Control Test Container 激活ActiveX Control Test Container OLE/COM Object Viewer 激活OLE/COM Object Viewer Spy++ 激活Spy++ MFC Tracer 激活MFC Tracer Customize 定制Tool菜单和工具栏4.1.2 菜单功能介绍1730
  • 31. 菜 单 命 令 加速键 功 能 说 明 Options 改变集成开发环境的各项设置 Macro 创建和编辑宏 Record Quick Macro 记录宏 Play Quick Macro 运行宏 续表(2)4.1.2 菜单功能介绍1831
  • 32. 8、Window菜单 Window菜单中的命令主要用来排列集成开发环境中的各个窗口、打开或关闭一个窗口、使窗口分离或重组等操作,改变窗口的显示方式,激活调试所用的各个窗口。菜单命令项及其加速键和功能如表4.8所示。 4.1.2 菜单功能介绍1932
  • 33. 表4.8 Window菜单命令的加速键及功菜 单 命 令 加速键 功 能 说 明 New Window 为当前文件打开一个新的窗口 Split 分割窗口 Docking View Alt+F6 启用或关闭Docking View模式 Close 关闭当前打开的窗口 Close All 关闭所有打开的窗口 Next 激活下一个窗口 Previous 激活上一个窗口 Cascade 多个窗口重叠出现在显示区域中 Tile Horizontally 把窗口按水平方向排列 Tile Vertically 把窗口按垂直方向排列 Windows 管理当前打开的窗口4.1.2 菜单功能介绍2033
  • 34. 9、Help菜 同大多数的Windws软件一样,Visual C++ 6.0提供了大量详细的帮助信息,这些信息都可以在Help菜单得到。Help的各项命令如表4.9所示。4.1.2 菜单功能介绍2134
  • 35. 表4.9 Help菜单命令的功能菜 单 命 令 功 能 说 明 Contents 显示所有帮助信息的内容列表 Search 利用在线查询获得帮助信息 Index 显示在线文件的索引 Use Extension Help 开启或关闭Extension Help Keyboard Map 显示所有的键盘命令 Tip of the Day 显示Tip of the Day对话框 Technical Support 显示Developer Studio的支持信息 Microsoft on th Web\Free Stuff 打开Developer Studio 97 Free Stuff页 Microsoft on th Web\Product News 打开Developer Studio 97产品消息页4.1.2 菜单功能介绍2235
  • 36. 续表(2)菜 单 命 令 功 能 说 明 Microsoft on th Web\Frequently Asked Questions 打开Developer Studio 97经常性问题页 Microsoft on th Web\Online Support 打开Microsoft在线帮助页 Microsoft on th Web\MSDN Online 打开Developer产品主页 Microsoft on th Web\Send Feedback 打开Developer产品信息反馈页 Microsoft on th Web\Best of the Web 打开最佳网页 Microsoft on th Web\Search the Web 打开查询页 Microsoft on th Web\Web Tutorial 打开指南页 Microsoft on th Web\Microsoft Home Page 打开Microsoft主页 About Visual C++ 显示本版本的有关信息4.1.2 菜单功能介绍2336
  • 37. 4.1.2 菜单功能介绍244.1.3 工具栏的使用1、标准(Standard)工具栏 工具栏是许多菜单命令相对应的按钮的组合体,提供执行常用命令的快捷方法。第一次运行Visual C++ 6.0时,显示的是默认状态下的标准工具栏,如图4.4所示。 图4.4 窗口式的Standard工具栏37
  • 38. 2、显示/隐藏工具栏 如果用户对当前显示的工具栏不满意,可以自己选择适当的工具栏加以显示,并隐藏那些不用的工具栏。 显示与隐藏工具栏的步骤如下: (1) 单击Tools菜单,选中Customize菜单项。 (2) 在弹出的对话框中,单击Toolbars标签,如图4.5所示。在该选项卡中显示有Toolbars列表框,其中显示默认的Menu bar、Standard、Build MiniBar和WizardBar工具栏条目被选中。若要显示某工具栏,只需单击该条目,使其前面出现“√”;而要隐藏某工具栏,则再次单击该条目,使其前面的“√”消失即可。 4.1.2 菜单功能介绍2538
  • 39. 图4.5 Customize对话框中的Toolbars选项卡4.1.2 菜单功能介绍2639
  • 40. 3、工具栏的定制 用户可以根据需要定制新的工具栏,或者对已有的工具栏进行修改,如添加新按钮、删除已有按钮等。 定制新的工具栏的步骤为: (1) 在图4.5中,单击New按钮,弹出New Toolbar对话框,输入新的工具栏名称(如MyTools)。 (2) 单击OK按钮,Toolbars列表框中增加新的工具栏(MyTools),同时它出现在屏幕上。单击Commands标签,出现图4.6。 4.1.2 菜单功能介绍2740
  • 41. 图4.6 Customize对话框中的Commands选项卡4.1.2 菜单功能介绍2841
  • 42. (3) 添加新按钮。在Category下拉列表框中选一项,对应的右边Buttons组框中会出现相应的一组按钮,从中选择需要的按钮,拖动到新创建的工具栏即可。工具栏中的其它按钮自动调整排列位置。 (4) 删除工具栏中的按钮。在出现图4.5或图4.6后,用鼠标点中该工具栏按钮并拖动,一直脱离Visual C++ 6.0的工具栏和菜单即可。 4.1.2 菜单功能介绍2942
  • 43. 4.1.3 资源与标识符14.1.3 资源与标识符1、资源 在Windows环境下进行程序设计时, 可以将一些数据如字符串常量、位图等以特殊的格式存储在资源文件中。它们可以被单独地编辑修改,编写程序代码时只需引用它们的资源标识符即可,无须直接将数据写入程序代码中。资源视图中显示了Windows资源的类型,包括加速键(Accelerator)、光标(Cursor)、对话框(Dialog)、图标(Icon)、菜单(Menu)、串表(String Table)、工具栏(Toolbar)和版本信息(Version)等,程序员也可以根据需要自定义资源的类型。43
  • 44. 2、资源编辑器 使用资源编辑器,可以创建新的资源,修改已有的资源,拷贝资源以及删除无用的资源。创建或打开资源时,系统将会自动打开相应的编辑器。 创建新资源 从Insert菜单中选择Resource命令或从工具栏中单击Resource按钮,弹出Insert Resource对话框,如图4.7所示。从Resource Type列表框中选择资源类型,然后单击New按钮即可创建新的资源。 4.1.3 资源与标识符244
  • 45. 图4.7 Insert Resource对话框4.1.3 资源与标识符345
  • 46. 查看和修改资源 图4.2中,单击“+”标记扩展每一分类来查看资源。可以用菜单命令复制、移动、粘贴或删除资源,也可以双击它打开相应的编辑器来修改资源,并运用资源属性对话框来修改资源的语言属性或条件属性。 资源模板 创建资源模板的方法与创建资源文件的方法基本相同,区别在于必须使用File菜单中Save As命令将资源模板保存在Microsoft Visual Studio \ Common \ MSDev98 \ Template文件夹中。创建资源模板后,可在资源模板上创建新的资源。 4.1.3 资源与标识符446
  • 47. 资源标识符 资源标识符由映射到数值上的字符串组成,用于在源代码或资源编辑器中引用资源或对象。创建新的资源或对象时,系统自动为其提供默认标识符(如IDD_ABOUTBOX)和符号值。标识符和符号值自动保存在系统生成的资源文件resource.h中。 标识符通常带有描述性前缀,以表示资源或对象的类型。例如,加速键或菜单前缀为IDB_;对话框前缀为IDD_;光标前缀为IDC_;图标前缀为IDI_;位图前缀为IDB_;菜单项的前缀为IDM_;命令前缀为ID_;控件前缀为IDC_;串表中串的前缀为IDS_;消息框中的串前缀为IDP_。4.1.3 资源与标识符547
  • 48. 随着应用程序的增大和复杂程度的增加,与其相关的资源符号也会不断增多。要手工跟踪分散在不同文件中的大量资源符号是相当困难的。资源符号浏览器简化了资源符号的管理。使用资源符号浏览器,用户可以: (1) 快速浏览已有资源符号的定义,以便了解每个资源的符号值、已使用的资源符号列表以及与每个符号相关的资源。 (2) 创建新的资源符号。 (3) 更改资源的符号名和符号值。 (4) 删除不再使用的资源符号。 (5) 快速切换到某个资源所对应的编辑器中。4.1.3 资源与标识符648
  • 49. §4.2 Windows编程基础知识49
  • 50. 1、窗口及组成菜单条(Menu bar)工作区下拉菜单水平滚动条垂直滚动条最大化按钮最小化按钮标题栏4.2.1 Windows图形用户界面状态栏50
  • 51. 2、常用Win32界面元素按钮、静态文本、编辑框、分组框、列表框、组合框、滚动条、旋转按钮、图像列表、进度条、标签(Tab)控件、菜单、工具栏、状态栏、 RTF编辑器、树控件。4.2.1 Windows图形用户界面251
  • 52. 4.2.2 Windows编程基本概念1、基本数据类型数据类型对应的基本数据类型说明BSTRunsigned short *16位字符指针BYTEunsigned char8位无符号整数COLORREFunsigned long用作颜色的32位值WORDunsigned short16位无符号整数DWORDunsigned long32位无符号整数,段地址和相关的偏移地址LONGlong32位带符号整数LPARAMconst char *作为参数传递给窗口过程或回调函数的32位值LPCSTRconst char *指向字符串常量的32位指针LPSTRchar *指向字符串的32位指针WPARAMunsigned int当作参数传递给窗口过程或回调函数的32位值表4.10 Windows基本数据类型4.2.2 Windows编程基本概念52
  • 53. 数据类型对应的基本数据类型说明LPCTSTRconst char *指向可移植为Unicode和DBCS字符串常量的32位指针LPTSTRconst char *指向可移植为Unicode和DBCS字符串常量的32位指针LPVOIDvoid *指向未定义类型的32位指针LRESULTlong来自窗口过程或回调函数的32位返回值UINTunsigned int32位无符号整数续表4.104.2.2 Windows编程基本概念253
  • 54. 2、有关句柄(handle)的概念句柄——用于标识不同的对象和同类对象中不同的实例的标识符。 句柄类似为指针,因为一个资源调入后会占用一块内存,句柄用于存放资源所在内存的地址。 句柄是处理对象的一个接口,对于程序中所涉及的对象,你可以通过句柄去操作它。 typedef void *HANDLE;4.2.2 Windows编程基本概念3句柄是Win应用程序编程的基础。应用程序以句柄访问相应的对象信息。54
  • 55. 句柄所标识对象实例窗口 按钮 图标 滚动条 输出设备 控件 文件 …...。55
  • 56. HWND 窗口句柄 HINSTANCE 当前实例句柄 HCURSOR 光标句柄 HFONT 字体句柄 HPEN 画笔句柄 HBRUSH 画刷句柄 HDC 设备环境句柄 HBITMAP 位图句柄 HICON 图标句柄 HMENU 菜单句柄 HFILE 文件句柄 常用句柄类型4.2.2 Windows编程基本概念456
  • 57. 4.2.3 Windows的程序设计方法4.2.3 Windows的程序设计方法1、使用API API:Application Programming Interface,即应用程序编程接口,他是windows操作系统提供给程序员的函数库。 该方法也称为SDK程序设计方法。 SDK的全称是Software Development Kit,即软件开发工具包的意思。如:调用API函数 ShowWindow( hwnd, nCmdShow ) ; 显示窗口57
  • 58. 4.2.3 Windows的程序设计方法22、使用MFC (Microsoft Foundation Class) MFC类库集成了大量已预先定义好的类,用户可以根据编程的需要使用相应的类,或根据需要自定义已有的类。 编程时使用应用程序向导产生一个初始的应用程序框架 ,在这个应用程序框架的基础上扩充直至符合自己的需要。 58
  • 59. 定义Win系统各种特殊函数及数据结构; 包含上千个可调用系统功能的标准API函数; 实现应用程序与Windows系统间的标准程序接口。(1)应用程序接口API(2)API函数实现三种功能窗口管理函数——窗口的创建、移动和修改: 图形设备(GDI)函数——与设备无关的图形操作 系统服务函数——与操作系统有关的多种服务。4.2.3 Windows的程序设计方法33、关于API:59
  • 60. MFC类库含有大量已定义好的类(class),可根据编程的需要,调用相应的类,或自定义有关的类 实现可视化交互开发方式 选择所需对象并确定其属性,搭建起应用程序的“大框架”; 编写必要的细节代码段,构成完整的应用程序。4、关于MFC的可视化编程4.2.3 Windows的程序设计方法360
  • 61. 窗口(Window) 事件驱动(Event-driven) 句柄(Handl) 消息(Message)利用API函数和MFC类库编写Windows应用程序,都必须了解下列有关概念:4.2.4 Windows编程特点4.2.4 Windows编程特点61
  • 62. 4.2.4 Windows编程特点21、由窗口组成的用户界面 用户界面由各种大大小心的窗口组成 各种窗口都有它自己的样式、消息和功能。窗口的属性在创建窗口的时候指定。 2、通过响应各种消息来进行事件的处理 windows程序在一个循环里不断等待系统或用户消息,并在取得消息后转向对应的消息处理函数执行一、Windows程序特点:62
  • 63. 4.2.4 Windows编程特点33、消息驱动机制 消息的分类: 硬件产生的消息(鼠标、键盘),这类消息放于系统的消息队列里面; 应用程序内部消息,如窗口的创建、移动或改变大小消息,刷新窗口的消息等。这些消息放在应用程序的消息队列里面;63
  • 64. 4.2.4 Windows编程特点4附加信息与具体消息号 的值有关应用程序利用消息与系统及其它应用程序进行信息交换。 消息的三个组成部分: 消息号:由事先定义好的消息名标识 字参数(wParam) :用于提供消息的附加信息 长字参数(lParam) :用于提供消息的附加信息二、有关消息的概念64
  • 65. 事件——一种情况或一种活动的发生、或一种指定状态的变化,例如,按下鼠标或键盘的键。三、有关事件驱动的概念 事件驱动编程方法 针对事件或消息的处理进行; 适于编写交互式程序。事件驱动——是由描述事件发生的信息,即消息驱动Win程序的执行。 程序的执取决于事件发生的顺序; 消息的产生并不要求有次序之分。4.2.4 Windows编程特点565
  • 66. 四、消息用结构MSG表示typedef struct tagMSG { HWND hwnd; //窗口句柄,为null,则检索队的所有消息 UINT message;//消息号,由Windows.h中的宏定义来标识 WPARAM wParam; //消息的附加信息 LPARAM lParam; //消息的附加信息 DWORD time; //指定消息送至队列的时间 POINT pt; //指定消息发送时屏幕光标的位置, }MSG; typedef struct tagPOINT { LONG x,y; //x和y分别表示屏幕的横坐标和纵坐标 }POINT;4.2.4 Windows编程特点666
  • 67. 五、消息的分类 各种消息分类,分别以不同的前缀表示: BM —— 按钮控制消息。 WM —— 窗口消息。 CB —— 组合框控制消息。 DM —— 默认下压式按钮控制消息。 EM —— 编辑控制消息。 LB —— 列表框控制消息。 SBM—— 滚动条控制消息。4.2.4 Windows编程特点767
  • 68. 窗口管理消息 初始化消息 输入消息 系统消息 剪贴板消息 控制处理消息控件通知消息 滚动条通知消息 非用户区消息 MDI消息 DDE消息 应用程序自定义的消息六、Windows编程常用消息4.2.4 Windows编程特点868
  • 69. 此外,类似的鼠标左右键消息还有: WM_LBUTTONUP: 放开左键时产生的消息; WM_RBUTTONDOWN: 单击右键时产生的消息; WM_RBUTTONUP: 放开右键时产生的消息; WM_LBUTTONDBLCLK:双击左键时产生的消息; WM_RBUTTONDBLCLK:双击右键时产生的消息。1. WM_LBUTTONDOWN: 产生单击鼠标左键的消息,附加信息: lParam——当前光标位置 低字节为X坐标值 高字节为Y坐标值 wParam——一整数值以标识鼠标键的按下状态 MK_LBUTTON 按下鼠标左键 MK_MBUTTON 按下鼠标中键 MK_RBUTTON 按下鼠标右键4.2.4 Windows编程特点969
  • 70. 2. WM_KEYDOWN: 按下一个非系统键时产生的消息 wParam——按下键的虚拟键码。 lParam——记录按键的重复次数、扫描码、转移代码及先前键的状态等信息。相似的消息还有WM_KEYUP, 在放开非系统键时产生3. WM_ CHAR: 按下一个非系统键时产生的消息 wParam——按下键的ASCII码。 1Param——与WM_KEYDOWN的相同。4.2.4 Windows编程特点1070
  • 71. 4. WM_CREATE: 由CreateWindow函数发出的消息。 wParam——未用。 lParam——个指向CREATESTRUCT数据结构的指针。6. WM_DESTROY: 由DestroyWiodow函数发出的消息。 wParam和1Param均未用。5. WM_CLOSE: 关闭窗口时产生的消息。 wParam和1Param均未用。4.2.4 Windows编程特点1171
  • 72. 7. WM_QUIT 退出应用程序时由PostQuitMessage函数发出的消息。 wParam——退出代码,标识退出时的有关信息。 lParam——未用。8. WM_PAINT用户区移动或显示用户窗口改变大小程序通过滚动条滚动窗口下拉式菜单关闭并需要恢复被覆盖的部分Windows清除对话框等对象,并需要恢复被覆盖的部分均产生 WM_PAINT 消息4.2.4 Windows编程特点1272
  • 73. §4.3 Windows应用程序的基本结构4.3.1 应用程序的组成一个完整的Windows应用程序通常包含如下几种类型的文件: C++语言源程序文件(.cpp) 头文件(.h) 模块定义文件(.def) 资源描述文件(.rc) 项目文件(.mak) …...73
  • 74. 1、一个简单的Windows程序#include int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MessageBox(NULL,"你好,我的朋友!","问候",1); return 0; }建立程序的步骤(课堂演示)4.3.1 应用程序的组成274
  • 75. 2、一个完整的Windows程序例子【Ex_HelloWin】(演示VC++程序)4.3.1 应用程序的组成375
  • 76. 入口函数WinMain窗口函数WndProcWindows应用程序构成基 本框架包含各种数据类型、数据结构与函数等WinMain和WndProc是 Windows应用程序的主体1. 所有应用程序的入口, 类似C的Main函数. 2. 完成一系列的定义和初始化,并产生消息循环。4.3.2 应用程序的说明76
  • 77. 三个基本的组成部分: 函数说明 初始化 消息循环 功能 注册窗口类,建立窗口及初始化 进入消息循环,据接受的消息调用相应的处理过程 当消息循环检索到WM_QUIT时终止程序运行。(1) WinMain函数4.3.2 应用程序的说明277
  • 78. 注意: Windows是多任务管理的,同一应用程序可能同时存在多个窗口,Windows系统对每个窗口的执行称为一个实例,并用一个实例句柄来唯一标识。int WINAPI WinMain ( HINSTANCE hInstance, ∥应用当前实例句柄 HINSTANCe hPrevInst, ∥前一实例句柄 LPSTR lpszCmdLine, ∥指向命令行参数的指针 Int nCmdShow ∥窗口显示状态 )4.3.2 应用程序的说明378
  • 79. 窗口类的定义:定义窗口的形式与功能 WNDCLASS wndclass; 并为wndclass的各个属性赋值. 窗口类的注册:窗口类必须先注册后使用 RegisterClass() 创建窗口实例 CreateWindow() 显示窗口 ShowWindow() UpdateWindow()(2) 初始化4.3.2 应用程序的说明479
  • 80. 4.3.2 应用程序的说明4(a)窗口类定义通过给窗口类WNDCLASS赋值,定义窗口类的各种属性。窗口类定义常用以下函数: LoadIcon加载一个窗口图标。其原型为: HICON LoadIcon ( HINSTANCE hInstance, LPCTSTR lpIconName )图标资源模块句柄图标资源名或系统预定义图标标识名80
  • 81. 4.3.2 应用程序的说明5(a)窗口类定义(续)LoadCursor加载一个窗口鼠标光标 HCURSOR LoadCursor ( HINSTANCE hInstance, LPCTSTR lpCursorName) GetStockObject获取系统提供的背景刷 HBRUSH GetStockObject(int nBrush); 定义窗口处理函数wndclass.lpfnWndProc=WndProc; 光标资源名或系统预定义图标标识名光标资源模块句柄81
  • 82. 4.3.2 应用程序的说明6窗口类必须先注册后使用。由函数RegisterClass()实现注册。 RegisterClass(&wndclass); //wndclass为窗口类结构 //RegisterClass函数的返回为布尔值,注册成功则返回真(b)注册窗口类82
  • 83. 4.3.2 应用程序的说明7由函数CreateWindow()创建窗口类的实例。 HWND Create Window ( LPCTSTR lpszClassName, ∥窗口类名 LPCTSTR lpszTitle, ∥窗口标题名 DWORD dwStyle, ∥创建窗口的样式 int x,y, ∥窗口左上角坐标 int nWidth,nHeight, ∥窗口宽度和度高 HWND hwndParent, ∥该窗口的父窗口句柄 HWENU hMenu, ∥窗口主菜单句柄 HINSTANCE hInstance, ∥应用程序当前句柄 LPVOID lpParam ∥指向传递给窗口的参数值的指针 )(c) 创建窗口示例83
  • 84. 标识说明WS_BORDER创建一带边框的窗口WS_CAPTION创建一带标题栏的窗口WS_HSCROLL创建一带垂直滚动条的窗口WS_MAXIMIZEBOX创建一带最大化框的窗口WS_MAXIMIZE创建一最大尺寸的窗口WS_MINIMIZEBOX创建一带最小化框的窗口WS_MINIMIZE创建一最小尺寸的窗口WS_OVERLAPPED创建一带边框和标题的窗口WS_OVERLAPPEDWINOW创建一带边框、标题栏、系统菜单及最大、最小化框的窗口WS_POPUP创建一弹出式窗口WS_POPUPWINDOW创建一带边框和系统菜单的弹出式窗口WS_SYSMENU创建一带系统菜单的窗口WS_VSCROLL创建一带水平滚动条的菜单表4.11 常用窗口样式4.3.2 应用程序的说明884
  • 85. 4.3.2 应用程序的说明9(d)显示窗口由ShowWindow和UpdateWindow显示 调用ShowWindow函数在屏幕上显示窗口 ShowWindow(hwnd,nCmdshow); //nCmdshow为窗口显示形式标识85
  • 86. 4.3.2 应用程序的说明10(d)显示窗口(续)显示窗口后,调用UpdateWindow更新并绘制用户区,并发出WM_PAINT消息。 UpdateWindow(hwnd);86
  • 87. (3) 消息循环消息循环的常见格式如: MSG Msg; … while (GetMessage (&Msg,NULL,0,0)) { TranslateMessage(&Msg); DispatchMessage(&Msg); }将消息的虚拟键 转换为字符信息将消息传送到 指定窗口函数将消息传递给窗口函数的相应过程处理消息队列Windows将产生的消息WinMain函数4.3.2 应用程序的说明1187
  • 88. 从消息队列中读取 一条消息,并将消 息放在MSG结构中 其中函数GetMessage形式为: GetMessage (lpMSG, //指向MSG结构的指针 hwnd, nMsgFilteMin, //用于消息过滤的最小消息号值 nMsgFilterMax //用于消息过滤的最大消息号值 )返回零值,即检索 到WM_QUIT消息,程 序结束循环并退出4.3.2 应用程序的说明1288
  • 89. 2. 窗口处理函数WndProc WinProc函数由一个或多个switch语句组成。每一条case语句对应一种消息,当应用程序接收到一个消息时,相应的case语句被激活并执行相应的响应程序模块。WndProc包含了对各种可能接收到的消息的处理过程定义了应用程序对接收到的不同消息的响应4.3.2 应用程序的说明1389
  • 90. 窗口处理函数的一般形式如下: LRESULT CALLBACK WndProc(HWND hwnd, UINT messgae, WPARAM wParam,LPARAM lParam ) { … switch(message) ∥ message为标识的消息 { case … … break; … case WM_DESTROY: PostQuitMessage(0); default: return DefWindowProc(hwnd,message,wParam,lParam); } return(0); }为未定义处理过程的消息提供缺省处理4.3.2 应用程序的说明1490
  • 91. 在消息处理程序段中一般都有对WM_DESTROY的处理,该消息是关闭窗口时发出的。它响应用程序发出WM_QUIT消息,请求退出处理函数: void PostQuitMessage(int nExitCode) //nExitCode为应用程序的退出代码4.3.2 应用程序的说明1591
  • 92. 【例4-1】应用程序窗口示例,本例的目的在于说明创建Windows窗口的方法及过程。#include//包含应用程序中所需的数据类型和数据结构的定义 LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); //窗口函数说明 //--------------- 以下初始化窗口类 ---------------------- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow) { HWND hwnd ; MSG Msg ; WNDCLASS wndclass ; char lpszClassName[] = "窗口"; //窗口类名 char lpszTitle[]= "My_Windows"; //窗口标题名4.3.3 应用程序举例92
  • 93. //窗口类的定义 wndclass.style=0; //窗口类型为缺省类型 wndclass.lpfnWndProc=WndProc; //定义窗口处理函数 wndclass.cbClsExtra=0; //窗口类无扩展(内存扩展) wndclass.cbWndExtra=0; //窗口实例无扩展 wndclass.hInstance=hInstance; //当前实例句柄 wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION); //窗口的最小化图标为缺省图标 wndclass.hCursor=LoadCursor(NULL,IDC_ARROW) ; //窗口采用箭头光标 wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); //窗口背景为白色 wndclass.lpszMenuName=NULL; //窗口中无菜单 wndclass.lpszClassName=lpszClassName ; //窗口类名为"窗口"4.3.3 应用程序举例293
  • 94. //--------------- 以下进行窗口类的注册 ------- if(!RegisterClass( &wndclass))//如果注册失败则发出警告 { MessageBeep(0) ; return FALSE ; } //---------------- 创建窗口 ------------------- hwnd=CreateWindow ( lpszClassName, //窗口类名 lpszTitle, //窗口实例的标题名 WS_OVERLAPPEDWINDOW, //窗口的风格 CW_USEDEFAULT, CW_USEDEFAULT, //窗口左上角坐标为缺省值 CW_USEDEFAULT, CW_USEDEFAULT,, //窗口的高和宽为缺省值 NULL, //此窗口无父窗口 NULL, //此窗口无主菜单 hInstance, //创建此窗口的应用程序的当前句柄 NULL //不使用该值 );4.3.3 应用程序举例394
  • 95. //--------------- 显示窗口 ---------------------- ShowWindow( hwnd, nCmdShow); //-------------- 绘制用户区 --------------------- UpdateWindow(hwnd); //--------------- 消息循环 ---------------------- while( GetMessage(&Msg, NULL, 0, 0)) { TranslateMessage( &Msg) ; DispatchMessage( &Msg) ; } return Msg.wParam; //消息循环结束即程序终止时将信息返回系统 }4.3.3 应用程序举例495
  • 96. //窗口函数 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_DESTROY: PostQuitMessage(0); case WM_LBUTTONDOWN: //按下鼠标左键 MessageBox(NULL,“Hello,my friend",“Msg”,0); default: //缺省时采用系统消息缺省处理函数 return DefWindowProc(hwnd,message,wParam,lParam); } return(0); }4.3.3 应用程序举例596
  • 97. 4.3.4 Windows程序的基本流程初始化应用程序初始化并创建应用程序窗口进入消息循环,不断获取消息消息是否为WM_QUIT?终止程序应用程序是否处理了消息处理消息传送消息给窗口进行默认处理开始执行97
  • 98. 提示:Windows程序所作的一切,都是为了响应发送给窗口消息处理程序的消息。 在大多数Windows程序中,程序的主要部分都用来处理消息。 Windows可以发送给窗口消息处理程序的消息通常都以WM开头的名字标识,并且都在WINUSER.H表头档案中定义。 98
  • 99. 小结:Windows程序工作原理示意用户用户界面Windows系统程序中的对象特定消息处理程序操作事件消息调用99
  • 100. 上机练习1、编制一个简单的Windows 32程序,试验各种窗体选项、窗体图标、光标等。 如窗体的光标使用沙漏:IDC_WAIT100