吉林大学远程教育.ppt

上传人:小飞机 文档编号:6409675 上传时间:2023-10-28 格式:PPT 页数:26 大小:260.49KB
返回 下载 相关 举报
吉林大学远程教育.ppt_第1页
第1页 / 共26页
吉林大学远程教育.ppt_第2页
第2页 / 共26页
吉林大学远程教育.ppt_第3页
第3页 / 共26页
吉林大学远程教育.ppt_第4页
第4页 / 共26页
吉林大学远程教育.ppt_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《吉林大学远程教育.ppt》由会员分享,可在线阅读,更多相关《吉林大学远程教育.ppt(26页珍藏版)》请在三一办公上搜索。

1、吉林大学远程教育课件,Windows A P I编 程,主讲人:翟慧杰,学 时:48,习题1,四、Windows绘图程序设计 图形设备接口(GDI:Graphics Device Interface)是Windows的子系统,它负责在视频显示器和打印机上显示图形。正如您所认为的那样,GDI是Windows非常重要的部分。不但您为Windows编写的应用系统在显示视觉信息时只使用GDI,就连Windows本身也只使用GDI来显示用户界面对象,诸如菜单、滚动条、图标和鼠标光标。从程序员的观点来看,GDI由几百个函数调用和一些相关的数据类型、宏和结构组成。但是在开始讲述这些函数的细节之前,让我们先从

2、宏观上了解一下GDI的整体结构。,组成GDI的几百个函数调用可以分为几大类:获取或创建和释放(或清除)设备描述表的函数 在绘图时需要设备描述表句柄。GetDC和RealseDC函数让您在非WM_PAINT 的消息期间来做到这一点,而 BeginPaint和 EndPaint函数(虽然在技术上它们是 USER模块而不是GDI模块的一部分)在进行绘图的WM_PAINT消息期间使用。获取有关设备描述表信息的函数 GetTextMetrics函数来获取有关设备描述表中当前所选字体的尺寸信息。绘图函数 显然,在所有前提条件都得以满足之后,这些函数是真正重要的部分。我们使用TextOut函数在窗口的客户区

3、显示一些文本。我们将看到,其他GDI函数还可以让您画线、填充区域。,在屏幕或打印机上显示的图形类型本身可以被分为几类,通常被称为“图元”,它们是:直线和曲线 线条是所有矢量图形绘制系统的基础。GDI支持直线、矩形、椭(包括椭圆的子集,也就是我们所说的“圆”)、椭圆圆周上的部分曲线即所谓“弧”,以及贝塞尔曲线,我们将在本章中分别对它们进行介绍。所有更复杂的曲线可由折线(polyline)代替,折线通过一组非常短的直线来定义一条曲线。线条用设备描述表中选中的当前画笔绘制。窗体客户区绘图步骤:1获取设备环境句柄 2获取绘图工具 3选择绘图工具 4利用选择的绘图工具绘图 5恢复原来的绘图工具并删除选择

4、的绘图工具 6释放设备环境句柄,WINDOWS GDI 函数:1GetDC()函数 功能:用于获取指定窗体客户区的显示器设备描述表句柄。2ReleaseDC()函数 功能:用于释放设备描述表句柄。3BeginPaint()函数 功能:用于获取窗体客户区绘图的相关信息,并为绘图做好准备。4.EndPaint()函数 功能:用于结束窗体客户区绘图。5.SetPixel()函数 功能:用于在窗体客户区绘制点(像素)。6、RGB()宏 功能:用于设置颜色。7、CreatePen()函数 功能:用于建立逻辑笔。,8、MoveToEx()函数 功能:用于窗体客户区移动逻辑笔。9、LineTo()函数 功能

5、:用于在窗体客户区当前位置画线。10、Ellipse()函数 功能:用于窗体客户区绘制椭圆。11、SelectObject()函数 功能:用于选择一种绘图工具柄将其装入设备描述表。12、DeleteObject()函数 功能:用于删除一个绘图工具。13、TextOut()函数 功能:用于在窗体客户区输出文本。14、SetBkMode()函数 功能:用于设置窗体客户区背景填充方式。15、SetTextColor()函数16、CreateFont()函数,其它函数1SetTimer()函数功能:用于建立产生时间消息的时间控件。2、KillTimer()函数 功能:用于取消时间控件。3、GetCli

6、entRect()函数 功能:用于获取窗体客户区范围。画点和线:我们已谈论过Windows图形设备接口将图形输出设备的设备驱动程序与计算机连在一起的方式。在理论上,只要提供SetPixel和GetPixel函数,就可以使用图形设备驱动程序绘制一切东西了。其余的一切都可以使用 GDI模块中实现的更高级的例程来处理。例如画线时,只需GDI调用 SetPixel数次,并适当地调整和Y坐标。在实际情况中,也的确可以仅使用SetPixel和GetPixel函数进行您需要的任何绘制。您也可以在这些函数的基础上设计出简洁和构造良好的图形编程系统。唯一的问题是性能。如果一个函数通过几次调用才能到达SetPix

7、el函数,那么它运行起来会非常慢。如果一个图形系统画线和进行其他复杂的图形操作是在设备驱动程序的层次上,它就会更有效得多,因为设备驱动程序对完成这些操作的代码进行了优化。此外,一些视频适配器卡包含了图形协处理器,它允许视频硬件自己绘制图形。,五 文本和字体:文本输出是应用程序经常需要实现的功能。许多程序的运行结果都必须以文本输出形式显示;文字处理程序更是主要以文本作为处理的对象。所以,程序员掌握文本输出的基本原理和技术具有重要的意义。文本输出需要解决的问题是如何修改显示文本的字体、颜色和大小,以及如何协调在不同设备上显示文本的差异。,文本的设备描述表属性:设备描述表(Device Contex

8、t)是一个决定输出的位置和外形的属性集合。在用户编制的应用程序中可以通过设备描述表句柄间接地读取设备描述表。当程序为设备描述表申请一个句柄时,系统就自动生成了一个设备描述表,生成的设备描述表包含了所有属性的默认值。背景色定义了填充字符,以及填充字符间区域的颜色。背景模式有两种取值:OPAQUE和 TRANSPARENT。默认值为 OPAQUE表示背景颜色有效;如果设定为TRANSPARENT,则表示关闭背景色。字符间距和文本颜色分别表示两个字符间的间隔和字体的颜色。字体描述了所显示字符的大小、外形和种类,也就是说字体包含了字符集中每个字符属性的抽象描述。字体分为两种基本类型:物理字体和逻辑字体

9、。GDI(图形设备接口)常用的字体如表所示。,六、键盘和鼠标:在Microsoft Windows 中,键盘和鼠标是两个标准的用户输入源,在一些交叠的操作中通常相互补充使用。当然,鼠标在今天的应用程序中比10年前使用得更为广泛。甚至在一些应用程序中,我们更习惯于使用鼠标,例如在游戏、画图程序、音乐程序,以及Web创览器等程序中就是这样。然而,我们可以不使用鼠标,但绝对不能从一般的PC中拆掉键盘。相对于个人计算机的其他组件,键盘有非常久远的历史,它起源于1874年的第一台Remington打字机。早期的计算机程序员用键盘在Hollerith卡片上打孔,以后在哑终端上用键盘直接与大型主机通讯。PC

10、上的键盘在某些方面进行了扩展,包括了功能键、光标定位键和(通常都带有的)单独的数字键盘,但它们的输入原理基本相同。Windows程序获得键盘输入的方式:键盘输入以消息的形式传递给程序的窗口过程。实际上,第一次学习消息时,键盘就是一个明显的例子:消息应该传递给应用程序的信息类型。,Windows用8种不同的消息来传递不同的键盘事件。这好像太多了,但是(就像我们所看到的一样)程序可以忽略其中至少一半的消息而不会有任何问题。并且,在大多数情况下,这些消息中包含的键盘信息会多于程序所需要的。处理键盘的部分工作就是识别出哪些消息是重要的,哪些是不重要的。虽然应用程序在很多情况下可以通过鼠标实现信息的输入

11、,但到现在为止键盘仍然是PC机中不可替代的重要输入设备。用键盘当作输入设备,每当用户按下或释放某一个键时,会产生一个中断,该中断激活键盘驱动程序KEYBOARD.DRV来对键盘中断进行处理。KEYBOARD.DRV程序会根据用户的不同操作进行编码,然后调用Windows用户模块USER.EXE生成键盘消息,并将该消息发送到消息队列中等候处理。1扫描码和虚拟码 扫描码对应着键盘上的不同键,每一个键被按下或释放时,都会产生一个唯一的扫描码作为本身的标识。扫描码依赖于具体,的硬件设备,即当相同的键被 按下或释放时,在不同的机器上可能产生不同的扫描码。在程序中通常使用由Windows系统定义的与具体设

12、无关的虚拟码。在击键产生扫描码的同时,键盘驱动程序KEYBOARD.DRV截取键的扫描码,然后将其翻译成对应的虚拟码,再将扫描码和虚拟码一齐编码形成键盘消息。所以,最后发送到消息队列的键盘消息中,既包含了扫描码又包含了虚拟码。输入焦点:同一时刻,Windows中可能有多个不同的程序在运行,也就是说有多个窗口同时存在。这时,键盘由多个窗口共享,但只有一个窗口能够接收到键盘消息,这个能够接收键盘消息的窗口被称为拥有输入焦点的窗口。拥有输入焦点的窗口应该是当前的活动窗口,或者是活动窗口的子窗口,其标题和边框会以高亮度显示,以区别于其他窗口。拥有输入焦点的也可以是图标而不是窗口,此时,Windows也

13、将消息发送给图标,只是消息的格式略有不同。,窗口过程可以通过发送WM_SETFOCUS和 WM_KILLFOCUS消息使窗体获得或失去输入焦点。程序也可以通过捕获WM_SETFOCUS和WM_KILLFOCUS消息来判断窗体何时获得或失去输入焦点。其中WM_SETFOCUS消息表示窗口正获得输入焦点,WM_ KILLFOCUS消息表示窗口正失去输入焦点。键盘消息:键盘消息分为系统键消息和非系统键消息。系统键消息是指由Aft键和其他键组合而产生的按键消息。当系统键被按下时产生WM_ SYSKEYDOWN消息,当系统键被释放时产生WM_SYSKEYUP消息。Aft键与其他键形成的组合键通常用于对程

14、序菜单和系统菜单进行选择,或用于在不同的程序之间进行切换。因此,系统键消息应该交由Windows进行处理,用户所编制的程序一般不处理系统键消息,而是将这些消息交由DefWindowProc函数进行处理。如果用户想对系统键消息进行处理,应该在处理完这些消息后,再将其发送给DefWindowProc函数,使得Windows系统能够正常工作。,某些击键消息可以被转换成字符消息,例如字母键、数字键等。而有些键只能产生按键消息而没有字符消息,例如 Shift键、Insert键等。消息循环中的 TranslateMessage函数可以实现从击键消息向字符消息的转化。当GetMessage函数捕获一个WM_

15、SYSKEYDOWN消息或WM_KEYDOWN消息后,TranslateMessage函数判断产生该消息的键是否能够被转换成字符消息,如果能,就将该消息转换成字符消息,再通过DispatchMessape函数将转换后的字符消息发送到消息队列中去。Windows的消息一般是通过一个MSG结构体变量传送给消息处理函数的。对于键盘消息,MSG结构体变量的各个域中较重要的是 lParam域和 wParam域。wParam域用于保存按键的虚拟键代码或字符的ASCII码。对于非字符消息,wParam域保存按键的虚拟健代码;对于字符消息,wParam域不保存字符的ASCII码。lParam域则用于保存击键时

16、产生的附加信息,实际上一个32位的lParam变量被分为六部分,记录了以下相关信息:重复次数、OEM扫描码、扩展键标志、关联键标志、前一击键状态和转换状态。lParam域各位的含义如表所示。,对于非字符消息,wParam域保存按键的虚拟健代码;对于字符消息,wParam域不保存字符的ASCII码。lParam域则用于保存击键时产生的附加信息,实际上一个32位的lParam变量被分为六部分,记录了以下相关信息:重复次数、OEM扫描码、扩展键标志、关联键标志、前一击键状态和转换状态。lParam域各位的含义如表所示。,随着Windows操作系统的流行,鼠标因为其精确定位和操作方便的优点而成为计算机

17、不可缺少的输入设备。一、鼠标的基础知识 本节将介绍在程序中用鼠标作为输入设备的方法和技巧。1鼠标操作和鼠标消息用户在使用鼠标操作的过程中,经常会使用的主要方式有五种,如表所示。,其中,前三种操作是最为基本的操作,可以产生Windows内部定义的消息,并通过这些消息来判断用户具体执行了哪种操作。Windows定义的鼠标消息共有20条,其中非编辑区的鼠标消息一般交由系统处理,程序只处理编辑区内的鼠标消息。编辑区内的鼠标消息共有10条,如表所示。,对于前表所列的鼠标操作中的最后两种,不能直接使用Windows定义的消息来判断,只能通过编程,将多种消息和数据组合之后判断。例如,判断用户是否按下鼠标左键

18、之后进行拖动操作可以通过以下程序段来实现,用case语句来实现:case WM_MOUSEMOVE:if(wParam&MK_LBUTTON)/只处理鼠标拖动的消息/处理程序 在处理鼠标消息的过程中,消息的wParam参数和lParam参数起了重要的作用。wParam参数中保存了在消息产生时其他操作进行的状态;用户可以通过位屏蔽操作来判断在该消息产生的同时,其余操作是否正在进行。这正是在程序中判断复杂鼠标操作的基本方法。例如,上面判断拖动操作的程序段就用了位操作 wParam MK_LBUTTON,判断在鼠标移动(WM_MOUSEMOVE)的同时鼠标左键是否同时被接下。如果,鼠标左键同时按下,

19、则位操作的结果为TRUE,说明当前操作为拖动操作,程序可以继续进行下一步处理。,又如需要判断单击鼠标左键时是否同时按下了Ctrl键或Shift键,可以用以下程序段来处理:case WM_ LBUTTONDOWN:if(wParam MK_CTROL)/Ctrl键同时按下 if(wParamMK_ SHIFT)/Ctrl 键和Shift键都同时按下/处理程序 else/Ctrl健同时按下,但 Shift键没有被按下./处理程序 else if(wParamMK_ SHIFT)/Shift键同时按下,但 Ctrl键没有被接下/处理程序 else/Shift 键和Ctrl键都未按下/处理程序,lPa

20、ram参数保存了消息产生时鼠标所在点的坐标,其中低16位为X坐标,高16位为Y坐标。在处理鼠标消息的时候,如果需要处理鼠标双击消息,则在注册窗口类时,窗口的风格必须包括CS_DBCLCKS。否则即使执行了双击操作,窗口也只能收到两条WM_ BUTTONUP和 WM_BUTTONDOWN消息。区分双击操作和两次单击操作是以两次击键的时间间隔为标准的。当两次击键的时间间隔小于 500毫秒时,Windows将其视为双击操作:如果两次击键的时间间隔大于500毫秒,Windows将其视为两次单击操作。500毫秒为默认的时间间隔,用户可以通过调用SetDoubleClickTime函数来修改这一时间间隔。

21、SetDoubleClickTime函数的原型定义如下:BOOL SetDoubleClickTime(UINT uInterval/新的击键时间间隔);,鼠标捕捉 在通常情况下,只有当鼠标位于窗体内时,窗体才能接收到鼠标的消息。如果需要接收所有的鼠标消息而不论鼠标是否在窗口内,这时可以调用SetCapture函数来实现。SetCapture函数的原型定义如下:HWND SetCapture(HWND hwnd/窗口句柄);调用SetCapture函数后,所有鼠标操作所产生的消息都直接发送到指定窗口。因为此时鼠标可能位于窗口之外,所以鼠标的坐标可能为负值。由于调用该函数会使其他窗口不能接收到键

22、盘和鼠标的消息,因此在完成操作后应及时调用ReleaseCapture 函数释放鼠标捕获。ReleaseCapture函数的原型定义如下:BOOL ReleaseCapture(VOID);,七、弹出式窗体与子窗体:我们讨论三种窗体,它们分别是“重叠式窗体”(overlapped window)“弹出式窗体”(popup window)与“子窗体”(child window)。第一节 窗体风格1.WS_OVERLAPPED2.WS_OVERLAPPEDWINDOW3.WS_POPUP4.WS_POPUPWINDOW5.WS_CHILD6.WS_CHILDWINDOW,利用带有WINDOW窗体风

23、格建立的窗体,一般具有较为完备的窗体要素;主窗体一般采用层叠式(WS_OVERLAPPED)窗体风格;子窗体一般采用子窗体(WS_CHILD)风格 或弹出式窗体(WS_POPUP)风格;利用子窗体(WS_CHILD)风格建立的子窗体只能在其父窗体的客户区内;利用弹出式窗体(WS_POPUP)风格或层叠式(WS_OVERLAPPED)窗体风格建立的子窗体可以子左面上任意移动。,第二节 相关函数一SetWindowText()函数 1.功能:用于设置窗体标题条标题。2.函数声明:BOOL SetWindowText(HWND hWnd,LPCTSTR lpString);3.参数:hWnd:窗体句柄;lpString:指向标题字符串指针。4.返回值:如果成功,返回TRUE,否则返回FALSE。,二wsprintf()函数 1.功能:用于内部文件写操作。2.函数声明:int wsprintf(LPTSTR lpOut,LPCTSTR lpFmt,.);3.参数:lpOut:内部文件指针;lpFmt:可是说明字符串;.:变量表。4.返回值:如果成功,返回内部文件长度,否则0。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号