孙鑫VC教程之Windows编程基础.ppt_第1页
孙鑫VC教程之Windows编程基础.ppt_第2页
孙鑫VC教程之Windows编程基础.ppt_第3页
孙鑫VC教程之Windows编程基础.ppt_第4页
孙鑫VC教程之Windows编程基础.ppt_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

1、一、Windows编程基础,Windows API Windows基础 绘图,Windows的优点,32位系统比16位系统寻址更多的内存空间,最多可达4GB【16位系统只有64K】。 16位系统把内存空间划分为许多不同的段【段地址+偏移,每段64K】,增加了寻址难度 32位系统采用平展式【flat】内存,它没有段,只是一个大的内存空间,从而使程序设计更加灵活、功能更强大。,Windows API,Windows是32位操作系统,Windows编程基于其应用程序编程接口(API),即Win API,有16位版本的Win API,但Windows95、98、NT都是32位版本的Win API,称之

2、为Win32 API,或简称为Win32。 什么是Win32 API呢?API是几百个函数的集合,包括大量的常数、宏定义、结构、类型等,它们是用C语言编写的,现在也可以用其它语言调用,如:Visual Basic、汇编语言、Fortran、Pascal和其它编程语言等。 大多数API都在Windows.h中定义,可以在Microsoft Windows软件开发工具包【SDK】中获得,也是Visual C+的一部分。,Windows API- Windows的主要概念,Win32 API函数基于一系列的Windows概念,包括图形用户界面【GUI】、消息【基于Windows的应用程序和基于MS-

3、DOS的应用程序之间最基本的一个差别在于:MS-DOS应用程序执行的流程是由程序自身控制的,而Windows的应用程序的执行则是通过消息驱动的,也就是说,是由用户控制的】、多重叠窗口、菜单、图标、资源、多任务以及鼠标使用等。 在MS-DOS下,数据可定义为常量,或者提供单独的数据文件供程序读取,而进行Windows程序设计时,可以将一些特定格式的数据存储在资源文件中,Windows通过“连编”,将资源文件嵌入到连接程序中,资源文件可以包含位图、图标、菜单、对话框和字符串等。 上述概念都与窗口有关。一些API函数可以用来创建窗口、调整窗口大小、移动窗口等,其它API函数用于在窗口中绘图、打开、读

4、出、写入和关闭文件,与操作系统和其它程序通信等。,Windows API-不同的Win32平台编程,不同的32 位操作系统(如Windows 95、98或NT)基于一个相同的API,意味着所有32位Windows的编程基本是相同的。尽管在API中包括某些函数只能用于Windows NT,而另外一些API函数仅用于Windows 95和Windows 98,但在不同的平台中,API核心是相同的。所以学会使用Windows 95编程,也可以在Windows 98和Windows NT中编程了。,Windows API-多任务和多线程编程,32位版本的Windows是多任务系统,作为多任务的操作系统

5、可同时运行多个程序。在Windows95中,操作系统为每个正在运行的程序分配小的时间段,由于时间段较短,对用户来说,这些程序是同时运行的。 Windows也允许在程序中使用多个线程。大多数程序只有一个可执行的线程,即所有代码只有一个执行路径,每条语句依次执行。但一个程序可以划分为2个或多个独立运行的线程,由每个线程各自完成它担负的处理任务,比如可在后台打印的同时,用户在主线程继续其它的工作。,Windows基础-事件,Microsoft Windows是用户驱动的系统,它大量的时间用于响应用户操作,这样的系统称为事件驱动系统。当用户按下一个键、移动鼠标或单击一个鼠标按钮,计算机硬件便通知Win

6、dows系统一个事件已经发生了,并告诉它事件的类型、发生的时间以及与屏幕相关事件的位置【例如坐标值】。 事件产生的主要原因有三个: 第一种通过输入设备,如键盘和鼠标; 第二种通过屏幕上的可视对象如菜单、工具栏和对话框控件【采用鼠标和键盘产生可视事件】; 第三种由Windows本身产生,例如恢复一个被其它窗口覆盖的窗口。,Windows基础-消息,当Windows知道事件发生后,就转化为“消息”,并将消息放在程序的消息队列中,程序的执行由消息驱动,与代码顺序无关。 Windows消息标识符是在Windows.h中定义的常数宏,消息一般采用WM_XX来定义,如WM_PAINT、WM_CHAR、WM

7、_LBUTTONUP、 WM_COMMAND等,消息数据结构包含的主要信息: 当前活动的应用程序。 在当前应用程序中活动的窗口。 事件发生时的当前光标位置。,消息结构: typedef struct tagMSG HWNDhwnd;/消息发向的窗口句柄 UINTmessage; /消息标识符 WPARAMwParam;/32位的消息参数(其含义和具体数值因消息而异) LPARAMlParam; /32位的消息参数(其含义和具体数值因消息而异) DWORDtime;/消息放入消息队列的时间 POINTpt;/消息放入消息队列时,鼠标光标的位置 MSG;,Windows基础-消息-消息循环,在应程

8、序中有一个消息循环,它的代码如下: while(GetMessage( 只要从应用程序消息队列中接受到的消息不是WM_QUIT,消息循环就继续从消息队列中接收消息。当收到WM_QUIT消息后,GetMessage将返回false,这样应用程序将终止运行。但只要循环继续下去,它就调用Win32 API的GetMessage函数获取下一消息;如果队列中没有消息,GetMessage就会等待消息的到来。 当GetMessage返回一个消息后,采用TranslateMessage函数来看一下是否由键盘输入,若由键盘输入则将原始的键盘消息转化为WM_CHAR消息。TranslateMessage也可以用

9、来处理键盘命令如Ctrl+X组合键等,TranslateMessage对非键盘消息则不进行任何处理。 最后,DispatchMessage消息确定应用程序哪一个窗口将获得消息,并把它发送给该窗口。,Windows基础-消息-消息处理函数,当应用程序获取消息之后进行何种处理,这由应用程序决定,一般有以下两种可能: 如果消息处理函数已经存在,那么它将调用该处理函数,处理该消息。 没有该消息的处理函数,需要把该消息返回Windows,Windows调用缺省处理函数DefWindowsProc来完成处理。在消息处理函数中完成何种处理,主要取决于要完成的动作,如:WM_PAINT消息处理函数处理重画,W

10、M_COMMAND消息处理函数【命令处理函数】显示对话框等。,Windows基础-消息-谁来调用,在所编写的消息处理函数中,可调用Win32 API,消息处理函数由Windows负责调用。大多数时间,程序代码等待被调用。 对Windows几百个消息,如果程序员不编写消息处理函数,则Windows提供一个缺省的DefWindowsProc函数。 Windows如何知道是那一个函数被调用呢?在由C编写的Windows程序中,在程序开始【WinMain函数中】设置WinProc的名字,然后采用这个名字编写函数。在WinProc函数中,使用C/C+switch语句,根据不同的消息,调用相应的消息处理函

11、数。当有一个窗口消息时,Windows调用该处理函数。在MFC中,可以不用编写窗口程序,只要编写消息处理函数,MFC通过消息映射来为消息查找相关的消息处理函数。,绘图,Microsift Windows 具有一个图形用户界面(GUI),它不是通过文本方式进行人机交互,而是通过可视的图形对象来进行人机交互。所显示的元素包括菜单、工具栏、滚动栏和对话框按钮。 所有的菜单、按钮和其它控件都是绘出来的。,绘图-子窗口和从属窗口,在Windows中,每一个控件和其它用户界面对象仅是一个窗口。例如,一个对话框是一个窗口,每一个按钮、编辑框和对话框中的其它控件也是一个窗口。子窗口在父窗口内部。 一个窗口【宿

12、主窗口】可以拥有其它窗口【从属窗口】,从属窗口不一定完全落在宿主窗口里面,例如一个对话框可被应用程序的主框架窗口或该窗口的一个子窗口所拥有。主窗口、子窗口、宿主窗口、从属窗口实例如图1-1所示。,绘图-刷新是怎样发生的,Windows通过消息知道何时来重画一个子窗口。 首先,当程序初始化显示一个窗口时,它需要重画窗口的的客户区。客户区是由窗口的的边框、标题栏和其它框架元素包围的空间,如图1-2。客户区一般由程序员负责,而窗口边框由Windows负责。 第二,当窗口被销毁和无效时,需要重画。例如当一个窗口覆盖另一个窗口,移走覆盖窗口时,为了使被覆盖的窗口重新可见,则需要重画。由于Windows不

13、保存窗口中的所有内容,因此需要程序员处理要重画的内容。,绘图-WM_PAINT消息,在上面两种情况下,Windows通过发送一个WM_PAINT消息。一般需要为WM_PAINT消息编写一个消息处理函数。有时需要重画一个窗口的部分内容,而有时则要重画所有窗口。 对于应用程序消息队列中的消息可以赋予不同的优先级,WM_PAINT消息一般赋予较低的优先级。由于重画没有其它操作紧迫,在空闲时执行。,Windows图形设备接口(GDI),MS-DOS应用程序都是直接往视频存储区或打印机口输送数据,这种做法的不利之处就是需要对每种显示卡或打印机类型提供相应的驱动程序。Windows提供了一个抽象的接口,称

14、作图形设备接口(GDI)。Windows已经提供了各种显示卡及打印机的驱动程序,这样就可以不必关心与系统相连的显示卡及打印机类型。在Windows中,抽象的图形设备接口(GDI),是通过称为设备描述表的逻辑设备,即DC来实现的。DC能够将绘图命令自动将地映射到相应的物理设备,其处理速度几乎和直接进行视频访问一样快!,设备描述表,一般由Windows负责框架的重画,而由程序员负责重画客户区域。每一个客户区,有一个Windows对象设备描述表(DC)与它相对应。设备描述表是Windows定义的数据结构,它包含了绘图的共同属性,如绘图位置、线宽、填充模式的颜色等等【MFC设备描述表对象封装了GDI的

15、全部绘图函数;GDI的绘图工具(如画笔、画刷等)存在图形对象(Graphic Objects)中,它们可被设备描述表引用】。 可以把设备描述表看做是一个绘图工具箱,包括画布及各种各样的画图工具。 可以改变设备描述表以及这些工具的属性。例如,可以调用函数,把文本颜色由缺省的黑色改变为红色,也可以选择为另外一种字体。但不能没有设备描述表绘图,在任何一个绘图处理函数中,必须首先获得一个设备描述表。 注意:每次获得一个设备描述表时,由Windows设置它的缺省属性。,设备描述表-句柄,Windows用句柄来标识和管理对象。句柄是Windows系统给的,且是唯一的,并可通过Windows访问。例如,调用

16、GetDC函数可返回设备描述表(即DC)句柄。设备描述表句柄类型是HDC。Windows提供了许多句柄类型,如窗口、画刷、字体等对象都有一个相关的句柄类型:HWND、HBRUSH和HFONT,下表显示了不同对象的句柄类型。,设备描述表-Win32 API 函数,采用设备描述表句柄HDC,可以调用一百多个函数用于客户区绘图,下表显示了常用的绘图函数。,在MFC中,上面的函数是CDC类的成员函数,CDC表示设备描述表类。 GDI(Graphics Device Interface) 是图形与所有输出设备之间的抽象的接口,它的主要目标是,使图形输出与输出设备(显示器、打印机和绘图仪)无关。 GDI提

17、供一系列的用于绘制点、线、矩形、多边形、椭圆、位图以及文本的函数,CDC类封装了GDI的全部绘图函数。,坐标系,上表列举的绘图函数需要有关设备位置信息,为了设定所绘图形的位置,需要一个坐标系,图1-3列举了两个常用的坐标系。 Windows提供了8种不同的坐标系,每一种都有各自的用途,图1-4显示了缺省的坐标系。 在缺省的坐标系中,x向右为正,而y轴向下为正,没有负的坐标。,坐标系-逻辑坐标系和设备坐标系,坐标系是设备描述表的一部分,在窗口区绘图时,所用的设备描述表仅与窗口客户区有关,这意味着坐标原点在窗口客户区的左上角。然而有时,Windows中传递的位置信息,不是相对于客户区窗口坐标系而是

18、整个屏幕空间,比如一个窗口的非客户区鼠标信息中,传递的是屏幕坐标系,如图1-5,这意味着该坐标系相对于屏幕上左上角原点,而不是客户区的左上角,一个窗口也可以看作是一个设备,它有一个设备描述表与之关联,因此窗口中的这种坐标系被称为设备坐标系。设备坐标是在屏幕中的具体位置,它相对于窗口原点而言,并采用象素为单位。然而,一般需要在窗口的逻辑坐标系中绘图,因此需要把该点转化为自己的坐标系,窗口缺省的逻辑坐标系MM_TEXT以屏幕上象素点为单位。,坐标系-映射模式,映射模式定义了Windows内部如何将GDI函数中指定的逻辑坐标映射为设备坐标。 Windows定义了8种映射模式【或称8种逻辑坐标系】。 缺省的映射模式为MM_TEXT,它不是“在这种模式下仅用于绘制文本”的含义,它的含义是:如同一页纸中的文本一样,它的原点在左

温馨提示

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

评论

0/150

提交评论