c8_Windows应用程序设计.ppt
Windows应用程序设计应用程序设计西北工业大学计算机学院周兴社 谷建华 倪红波 Windows应用编程基础 Windows APIn API是应用程序编程接口(Application Programming Interface)的英文缩写。它是大量函数加上数字常量、宏、结构、类型以及其它相关项的集合。可以从C+、Microsoft Visual Basic汇编语言、Fortran、Pascal以及其它编程语言中调用这些函数。大多数API函数定义在称为Windows.h的文件中,也可以从Windows平台软件开发包(SDK)中得到它。n根据Windows API函数的功能,可以将其分为三类:n 窗口管理函数。用以实现窗口的创建、移动和修改功能。n 图形设备(GUI)函数。用以实现与设备无关的图形操作功能。n 系统服务函数。用以实现与操作系统有关的多种功能。WindowsWindows基础基础要掌握Windows编程的方法,必须要了解以下内容:n 事件及事件驱动的概念。n 消息及其在编程中的应用。n 绘图及设备环境。n 对象与句柄。n 坐标系。1 1事件事件n n Windows花费大量时间等待用户的动作以便作出响应,所以这种系统也叫做事件驱动的系统。当用户按下一个键、移动鼠标或单击鼠标按钮时,计算机通知Windows系统已经发生了一个事件,以及事件的种类、发生的时间、发生的位置(如坐标值)。事件以如下三种方式产生:n 通过输入设备,如键盘和鼠标。n 通过屏幕上可视的对象,如菜单、工具栏按钮、滚动条和对话框上的控件。n 来自Windows内部,如当一个后面的窗口显示到前面来。n 2 2消息消息n n当Windows捕获一个事件后,它会编写一条消息,将相关信息放入一个数据结构中,然后将包含此数据结构的消息发送给需要消息的程序。nWindows消息是在Windows文件中用宏定义的常数。消息常数名通常以WM开头,格式为WM_XXX,例如WM_QUIT、WM_CHAR。n n nWindows将消息放入目标应用程序的消息队列中。在消息队列中所有消息都处于等待状态,直到应用程序准备处理它。n应用程序中通常有一段代码称为消息循环,形式如下:While(GetMessage(&msg,NULL,0,0)TranslateMessage(&msg);DispatchMessage(&msg);n 在应用程序检索到WM_QUIT消息之前,这个循环会不断运行。当它收到WM_QUIT时,GetMessage返回false,循环停止,同时应用程序终止。n 当GetMessage返回一条消息后,循环将它传递给TranslateMessage函数以检测该消息是不是来自键盘。n如果是来自键盘的消息,则TranslateMessage将原始键盘消息转化为WM_CHAR消息。WM_CHAR消息是专为传递有关键入字母信息设计的。TranslateMessage不处理非键盘消息。n 消息处理函数是用于处理特定消息的一些代码。收到消息的应用程序会做些什么,取决于应用程序本身。程序员可以编写相应的处理函数以处理消息。n 如果程序员没有为该消息编写处理函数,又需要把消息传递给Windows,让Windows对消息进行默认处理,Windows会提供一个称作DefWindowProc的处理函数。Windows首先调用程序员提供的处理函数,而不用Windows的默认方式。n 对于特定的消息有许多标准或典型的处理。例如,WM_PAINT消息(在窗口中重新绘制内容时发送)的处理函数需要重新构造显示在窗口中的图像,需要重新绘制可见的文本行、图形等等。n另 外,经 常 需 要 编 写 处 理 函 数 的 一 条 消 息 是WM_COMMAND,用于处理来自菜单和按钮的命令,相应的处理函数可能会显示一个对话框、完成一次计算、选择一个选项或启动其它的操作等。n 3 3绘图及设备环境绘图及设备环境n Windows具有图形用户界面(GUI),它包括菜单、工具栏、滚动条和对话框中的按钮等元素。这些元素都是被绘制出来的。n 当程序第一次显示窗口时,需要第一次绘制窗口的内部或客户区。客户区是由窗口的边界、标题栏以及框架元素包围的空间。n 在窗口的任何部分被破坏或无效时,需要重新绘制它们。例如,当其它窗口覆盖在应用程序的窗口上,然后又离开。Windows不会保存窗口中的图像,由于它不能自己重新绘制所有的部分,因此程序需要重新绘制窗口的内容。n 在要求重新绘制时,一般由Windows负责绘制窗口的框架,而程序员负责绘制客户区。与客户区对应有一个Windows对象称为设备环境(Device Context,通常缩写为DC)。n n 4对象与句柄n 对设备环境的访问是通过Windows返回的句柄进行的。用于描述设备环境句柄的变量类型是HDC。事实上,Windows提供了许多种类型的句柄(窗口、字体等)。每种对象都有一个相应的句柄类型,例如HWND和HFONT。n常见的Windows对象的句柄如下:n Windows对象相关句柄n 设备环境HDCn 窗口HWNDn 菜单HMENUn光标HCURSORn画笔HPENn画刷HBRUSHn字体HFONTn图标HICONn位图HBITMAPn调色板 HPALETTEn文件HFILEn区域HRGNn加速键表 HACCELn Polygon用几个点绘制多边形n Pie绘制饼图n Rectangle在指定的坐标处绘制矩形n Ellipse在指定的坐标处绘制椭圆n 在MFC中,有许多函数是CDC类的成员函数。CDC指设备环境类(Device Context Class)。Windows中负责设备环境和绘制函数的部分称为图形设备接口(Graphics Device Interface,GDI)。n GDI是一个完整的两维绘制系统,它具有设备环境、绘制函数以及用于测量和定位所绘制的图像的几种坐标系统。n 5 5坐标系坐标系n 要为绘制和其它任务指定位置,需要坐标系统。Windows提供了8种不同的坐标系,每种都有各自的用途。Windows默认的坐标系原点在窗口客户区的左上角,x向右为正,y向下为正,没有负的坐标。n Windows消息映射及处理n 我们知道,用C+编写MS-DOS程序时一定要有一个main()函数,程序由main()函数开始运行,其它函数都是由main()函数调用的。同理,Windows程序需要有一个WinMain()函数(如果应用MFC类库,WinMain()函数就被隐蔽了),该函数主要是建立应用程序的主窗口。n Windows程序与MS-DOS程序的根本差别在于:MS-DOS程序是通过调用操作系统的功能来获得用户输入的,而Windows程序则是通过操作系统发送的消息来处理用户输入的,程序的主窗口中需要包含处理Windows所发送消息的代码。n 在Windows程序中,管理消息的方式通常是这样的:n当发生某个消息!(比如用户移动了鼠标和按下键盘等)后,该消息进入消息队列,n操作系统根据消息提供的信息决定由哪个应用程序来处理,n该应用程序依照一定的方式查找应用程序中各个类的消息映射(一组宏,这些宏用来确定某个消息及相应的处理程序的对应关系),n找到处理程序,然后由处理程序执行。