Windows编程基础 - Basic Programming Concepts.ppt_第1页
Windows编程基础 - Basic Programming Concepts.ppt_第2页
Windows编程基础 - Basic Programming Concepts.ppt_第3页
Windows编程基础 - Basic Programming Concepts.ppt_第4页
Windows编程基础 - Basic Programming Concepts.ppt_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

1 Windows编程基础 第一章 2 教学目的和任务 本课程的任务是讲授MicrosoftVisualC 6 0集成开发环境和VisualC 面向对象编程的基础知识和基本方法 突出MFC编程及其应用 着重强调VisualC 软件开发实践能力的提高 3 基本要求 获得必要的VisualC 编程的基本理论 基本知识和基本技能又提高软件项目开发能力 培养学生分析和解决软件工程项目的实践能力掌握相关工具的使用MicrosoftVisualC 6 0Oracle掌握对话框及常用控件 菜单 工具栏和状态栏的编程使用方法 掌握视图 文档结构及数据库编程 4 具体安排 MFCWindows程序设计课程表理论课安排项目实战短信群发软件考试安排项目评审笔试机试 5 学习经验 首先要对Windows编程概念和API函数有一定的了解 如WindowsAPI有哪些功能和哪些常用的数据结构等 学会抽象地把握问题 不求甚解 不要一开始学习VisualC 就试图了解整个MFC类库 从理解和使用两个方面学习MFC 理解MFC应用程序的框架结构 先大体上了解MFC的概念 组成和基本约定 从简单的类入手 结合程序设计 由浅入深 循序渐进 日积月累 编程时如果MFC某个类能完成所需要的功能 可以直接调用已有类的方法 成员函数 否则 可以利用面向对象技术中的 继承 方法对MFC类的行为进行扩充和修改 从MFC中已有的类派生出自己需要的类 学习MFC 另一点就是不要过分依赖于向导 Wizard 工具 向导能做许多工作 但同时掩饰了太多的细节 6 相关参考书 MFCWindows程序设计 第2版 JeffProsise著 VisualC 技术内幕 第四版 DavidJ Kruglinski著深入解析MFCGeorgeShepherd ScotWingo著深入浅出MFC 第二版 侯俊杰 侯捷 著 本章目标 Windows编程的基本概念Windows程序的运行原理消息和消息队列Windows编程的步骤WinMain函数窗口的设计 注册 创建和显示消息循环窗口的 生死存亡 8 Windows编程概述 Windows系统是一个消息驱动的操作系统 每一个事件的发生都会产生一个消息 我们通过消息来知道发生了什么事件 Windows编程是在实现程序算法的基础上进行窗口编程 程序员可以直接调用WindowsAPI进行Windows程序设计 也可以采用使用类库 比如MFC WTL等进行Windows程序设计 9 Windows编程概述 开发者在进行Windows程序设计过程中主要处理以下内容 Windows程序设计 程序算法的实现 应用程序界面的制定 其他 算法 软件的灵魂 界面 人机交互 因软件的特性而异 10 Windows编程特点 消息驱动机制图形设备接口 GraphicalDeviceInterface 简称GDI 基于资源的程序设计动态链接库KERNEL32 DLL用来处理存储器低层功能 任务和资源管理等核心服务GDI32 DLL用来提供图形设备接口 管理用户界面和图形绘制USER32 DLL负责窗口的管理进程和线程 11 Win32程序运行原理2 1 12 Win32程序运行原理2 2 13 消息和消息队列 MSG结构体定义如下 以上为消息队列中消息的封装形式 typedefstructtagMSG HWNDhwnd 接收消息的窗口句柄UINTmessage 消息标识号WPARAMwParam 消息额外参数1LPARAMlParam 消息额外参数2DWORDtime 消息进入队列的时间POINTpt 消息产生时的光标位置 MSG PMSG 14 消息和消息队列 对于开发者来说 消息由名称和内容这两个部分组成 15 消息队列 每个Windows程序都有一个消息队列 Queue 队列是一个先进先出的缓冲区 通常是一个某种变量类型的数组 队列里的每一个元素就是一条消息 操作系统将生成的每个消息按先后顺序放进消息队列里应用程序总是取走队列里的第一条消息 消息取走后 剩余的消息依次前移 应用程序得到消息后 就要对消息进行处理 消息响应 消息响应是我们通过编码实现的 这也是Windows程序的主要代码区 16 消息和消息队列 系统给每一个GUI线程维护一个消息队列 在所有线程产生时并没有消息队列 当线程第一次调用GDI函数时 系统给线程创建一个消息队列 线程消息队列接收由这个线程创建的所有窗口的鼠标键盘消息 线程删除队列中消息 系统调用窗口过程进行相应的处理 17 Win32编程中的数据类型2 1 18 Win32编程中的数据类型2 2 这些基本数据类型都是以大写字符出现 凡是数据类型的前缀是P或LP 表示该类型是一个指针或长指针数据类型 前缀是H 表示是句柄类型 前缀是U 表示是无符号数据类型使用typedef对现有的数据类型取个别名 希望从变量定义的类型上 就能区分出变量的用途 对于同一种变量类型 可按其用途细分定义成多种其他的形式 19 句柄 HANDLE Win32程序中产生的任何资源 图标 光标 窗口 应用程序的实例等 操作系统都要将它们放入相应的内存 并为这些内存指定一个唯一的标识号 这个标识号即该资源的句柄句柄常作为Windows消息和API函数的参数 在采用API方法编写Windows应用程序时要经常使用句柄 而采用MFC方法编写Windows应用程序时 由于对应的MFC类已对句柄进行了封装 大多数情况下不再需要访问句柄 20 句柄 HANDLE 21 关于API和SDK 操作系统所能够完成的每一个特殊功能通常都有一个函数与其对应 以函数的形式提供给应用程序使用 Win32SDK 这些函数的集合就是Windows操作系统提供给应用程序编程的接口 ApplicationProgrammingInterface 简称WindowsAPI API已成为一种被广泛使用的专业术语 某个系统或某个设备提供给某种应用程序对其进行编程操作的函数 类 组件等的集合 就称作该系统的API 22 Windows应用程序的基本流程 23 Win32程序实现的步骤 WinMain函数的定义创建一个窗口设计一个窗口类注册窗口类创建窗口显示及刷新窗口进行消息循环完成回调函数 24 WinMain函数2 1 在Windows应用程序中main 被WinMain 取代WinMain函数的原型 intWINAPIWinMain HINSTANCEhInstance 当前实例句柄HINSTANCEhPrevInstance 上一个实例句柄LPSTRlpCmdLine 传递给应用程序的参数字符串intnCmdShow 窗口显示状态 defineWINAPIFARPASCAL 修饰符WINAPI代表 stdcall 25 WinMain函数2 2 include 定义了Windows的所有数据类型 函数调用 数据结构和符号常量 intWINAPIWinMain HINSTANCEhInstance HINSTANCEhPrevInstance LPSTRlpCmdLine intnCmdShow if hPrevInstance MessageBox NULL 程序已经运行 提示 MB OK MB ICONINFORMATION return0 MessageBox NULL HelloWorld 提示 MB OK 26 窗口及生成 一个通常的Windows程序都具有窗口 通过窗口 用户可以对应用程序进行各种操作 窗口是应用程序和用户之间交互的界面对话框 命令按钮 文本框 选项按钮等都是窗口窗口创建的步骤 设计一个窗口类注册窗口类创建窗口显示及刷新窗口 27 WNDCLASS结构体3 1 通过WNDCLASS结构体变量设计窗口 指定窗口的属性 光标 图标 菜单 背景色等 typedefstruct WNDCLASS UINTstyle 窗口风格WNDPROClpfnWndProc 窗口过程intcbClsExtra 指定该结构的额外字节数intcbWndExtra Windows内部保存窗口时预留空间HINSTANCEhInstance 进程句柄HICONhIcon 应用程序图标句柄HCURSORhCursor 应用程序光标句柄HBRUSHhbrBackground 背景画刷句柄LPCTSTRlpszMenuName 菜单资源名LPCTSTRlpszClassName 窗口类名 WNDCLASS PWNDCLASS 28 WNDCLASS结构体3 2 style成员指定了这一类型窗口的样式CS NOCLOSE 这一类型的窗口没有关闭按钮CS VREDRAW 当改变窗口的垂直方向上的高度时 将引发窗口重画CS HREDRAW 当改变窗口的水平方向上的宽度时 将引发窗口重画CS DBLCLKS 设置该值可以接受到用户双击的消息lpfnWndProc指定了这一类型窗口的过程函数 也称回调函数cbClsExtra cbWndExtra一般都被初始化为0hInstance指定了提供回调函数的程序实例句柄hIcon指定了窗口的图标句柄 使用LoadIcon函数hCursor指定了窗口的光标句柄 LoadCursor函数 29 WNDCLASS结构体3 3 hbrBackground指定了这一类型窗口重画时所使用的刷子句柄 当窗口重画时会使用这里指定的刷子去刷新窗口背景 使用GetStockObject返回一个系统刷子 返回类型是HGDIOBJECT 图形设备对象的总称 必须转换成HBRUSHlpszMenuName指定了这一类型窗口的菜单lpszClassName指定了这一类型窗口的名称 是字符串变量 30 设计窗口类代码 intWINAPIWinMain HINSTANCEhInstance HINSTANCEhPrevInstance LPSTRlpCmdLine intnCmdShow HWNDhwnd 窗口句柄WNDCLASSwndclass 窗口类wndclass style CS HREDRAW CS VREDRAW 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 HelloWin 窗口类名 以下代码省略 31 注册窗口类 RegisterClass 设计完WNDCLASS后 需调用RegisterClass函数对其进行注册 经过注册之后 才可以创建该窗口函数的原型 ATOMRegisterClass CONSTWNDCLASS lpWndClass classdata 返回值为0代表注册失败 32 创建窗口 CreateWindow2 1 设计好了窗口类并且将其注册好以后就可以用CreateWindow函数产生这种类型的窗口了CreateWindow函数原型如下 HWNDCreateWindow LPCTSTRlpClassName registeredclassnameLPCTSTRlpWindowName windownameDWORDdwStyle windowstyleintx horizontalpositionofwindowinty verticalpositionofwindowintnWidth windowwidthintnHeight windowheightHWNDhWndParent handletoparentHMENUhMenu menuhandleorchildidentifierHINSTANCEhInstance handletoapplicationinstanceLPVOIDlpParam window creationdata 33 创建窗口 CreateWindow2 2 参数lpClassName是WNDCLASS的lpszClassName成员里指定的名称lpWindowName指定产生的窗口实例上显示的标题文字dwStyle指定产生的窗口实例的样式x y nWidth nHeight指定了窗口左上角的x y坐标 窗口的宽度 高度hWndParent指定了窗口的父窗口句柄参数hMenu指定了窗口的菜单或子窗口句柄参数hInstance指定了窗口所属的应用程序的句柄参数lpParam可以为窗口附加补充信息返回值 窗口创建成功 函数将返回系统为该窗口分配的句柄 否则 返回NULL 34 显示创建的窗口2 1 函数ShowWindow和UpdateWindow分别表示显示和刷新窗口 其函数原形分别如下 BOOLShowWindow HWNDhWnd handletowindowintnCmdShow showstate BOOLUpdateWindow HWNDhWnd handletowindow 35 窗口的注册 创建和显示代码 WinMain函数 窗口类设计代码省略if RegisterClass 更新窗口 包括窗口的客户区 以下代码省略 36 消息循环3 1 GetMessage函数从应用程序消息队列中取走一条消息该函数的原型如下 BOOLGetMessage LPMSGlpMsg 接收消息的变量的指针HWNDhWnd 接收属于哪个窗口的消息UINTwMsgFilterMin 接受某一范围内的消息UINTwMsgFilterMax 接受某一范围内的消息 返回值 除了WM QUIT消息外 该函数返回非零值 对WM QUIT消息 该函数返回零 37 消息循环3 2 TranslateMessage函数的作用是对取到的消息进行转换 将可行的WM KEYDOWN WM KEYUP WM SYSKEYDOWNWM SYSKEYUP消息对转换成一条WM CHAR消息或WM SYSCHAR消息 并将转换后得到的新消息投递到程序的消息队列中 不会影响原来的消息 只在消息队列中增加新消息 DispatchMessage函数将取到的消息传递到窗口的回调函数中去处理 可以理解成该函数通知操作系统 让操作系统去调用窗口的回调函数来处理收到的消息两个函数的参数都是消息变量的指针 38 消息循环3 3 WinMain函数 以上代码省略MSGmsg while GetMessage 以下代码省略 39 回调函数2 1 可以将函数名WindowProc改为我们喜欢的名称 回调函数的原型 LRESULTCALLBACKWindowProc HWNDhwnd 对应消息的窗口句柄UINTuMsg 消息码WPARAMwParam 第一个消息补充参数LPARAMlParam 第二个消息补充参数 40 回调函数2 2 LRESULTCALLBACKWndProc HWNDhwnd UINTmessage WPARAMwParam LPARAMlParam switch message caseWM LBUTTONDOWN MessageBox NULL HelloWorld 问候 0 return0 caseWM CHAR charmessage 100 sprintf message yourentercharis c wParam MessageBox hwnd message 提示 0 return0 returnDefWindowProc hwnd message wParam lParam 执行默认的消息处理 41 完整代码显示 对整个过程重新进行回顾完整代码演示运行结果 42 WinMain和WndProc函数的分

温馨提示

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

评论

0/150

提交评论