当前位置:编程学习 > C/C++ >>

Windows编程基础- 设备对象属性

设备对象属性决定着绘图方式,当使用GDI函数绘图时,所绘制的图形和文本的颜色、大小和位置等由设备对象的当前属性决定,应用程序可以使用GDI函数改变设备对象的当前属性。本章介绍设备对象的一些主要属性和用于改变这些属性的有关函数,其它的设备对象属性在后面的章节中陆续介绍。

3.1、图形设备接口
  在第二章,我们一直在使用图形设备接口(GDI),GDI的主要目标之一是支持在输出设备(例如显示器、打印机)上建立与设备无关的图形输出。Windows的图形大部分是由GDI.EXE(Windows系统的一个模块,称GDI模块)中的函数处理的。GDI模块通过调用在不同设备驱动程序模块中的例程来控制输出设备。例如,显示设备驱动程序用于访问与视频显示器有关的硬件。通过GDI,Windows可以确定驱动程序能够进行什么工作,并且由于应用程序只与GDI打交道。这样,GDI通过将应用程序与不同的输出设备隔离,使应用程序可以在支持Windows的任何图形输出设备上工作。
  图形输出设备可以分为两组:光栅设备和矢量设备。光栅设备将图象表示为点(象素)的图案。这类输出设备包括显示设备、点阵打印机和激光打印机。向量设备用线段来绘制图象,例如绘图仪。Windows的GDI是一种隔离了硬件具体特性的图形语言。虽然输出设备用象素来表示图形,但GDI却可以被用作一个高级的向量绘图系统,也可以被用来进行较低级的象素操作。
  在编写Windows应用程序时,程序员不必为颜色过分担心,如果在应用程序中使用的一种颜色不能被该显示器所表示,Windows或为应用程序选择一种最直接的纯颜色(显示设备可以表示的颜色),或通过将几种纯颜色相混合来表示这种颜色。当在彩色显示器上开发的程序运行在单色显示器上时,Windows将使用灰度来表示颜色。应用程序也可以在程序中确定输出设备的有关特性,例如,可表示的颜色数目、设备的显示区的尺寸等,以便最大限度地发挥硬件的能力。

3.2、设备对象属性
  设备对象具有许多决定GDI函数在设备对象上如何工作的当前属性。例如,在使用函数TextOut()时,只需要在函数中说明设备对象的句柄、绘制字符的起始坐标、文本和文本长度,而不用说明字体、文本颜色、背景颜色和字符间距等,因为这些特征由设备对象的属性决定。每种设备对象都赋有缺省的属性,可以使用GDI函数改变这些属性中的某一个。表3-1给出了显示设备各个属性的缺省值,当使用GetDC()和BeginPaint()等函数初次得到一个显示设备对象时,该对象的属性具有缺省值。

属性 缺省值
视区原点 (0, 0)
视区范围 (1, 1)
窗口原点 (0, 0)
窗口范围 (1, 1)
背景颜色 白色
背景方式 OPAQUE
位图 任意值
刷子 WHITE_BRUSH
刷子原点 (0, 0)
裁剪区 用户区/无效矩形区/子窗口区
调色板 DEFAULT_PALETTE
 
属性 缺省值
笔的当前位置 (0, 0)
笔的颜色 BLACK_PEN
文本颜色
设备的原点 用户区的左上角
绘图方式 R2_COPYPEN
字体 SYSTEM_FONT
字符间距 0
映射方式 MM_TEXT
多边形填充方式 ALTERNATE
相对一绝坐标 ABSOLUTE
缩放方式 BLACKONWHITE

  在本章以后的各节中将介绍其中一些设备属性,其它属性在以后章节中介绍。

3.3、设备坐标系
  为在输出设备上定位和绘制图形对象,必须引入一种坐标系。Windows的各种不同类型设备所使用的坐标称为设备坐标。它们使用笛卡尔坐标系,在这些设备坐标系中,单位都以象素的个数表示(称为设备单位)。x轴上的值自左向右增加,y轴上的值自顶向下增加,见图3-1。

图3-1 Windows的设备坐标系

  本节以视频显示设备为例介绍Windows的设备坐标系,其中的许多内容也适合用于象打印机等硬拷贝输出设备。
  在Windows环境中,视频显示设备是一个共享设备,即在同一时刻,显示设备上可以同时显示多个应用程序的输出信息。为了保护一个程序显示的信息不被其他程序破坏,Windows通过将显示区看作不同的设备对象来限制应用程序输出信息的范围。
  一个应用程序可获取三种不同的显示设备对象句柄,每种句柄所标识的设备对象代表屏幕上的不同区域。我们可以将这三个句柄所标识的对象视作三个不同的抽象显示设备,都带有如图3-1所示的设备坐标系,但对不同的抽象设备,坐标原点不一样的。这样,当使用相同的起始坐标而使用不同的设备对象句柄调用GetDC函数(例如TextOut())进行绘图时,信息显示的位置不一样。
  第一抽象设备是用户区对象,它的坐标原点在用户区的左上角。定位该区域的设备坐标系称为用户区坐标系。使用函数GetDC()或BeginPaint()得到的句柄是标识用户区的句柄。当使用该句柄标识该区域的句柄作为GDI函数的参数时,GDI函数所使用的坐标值是相对于用户区坐标系。
  第二个抽象设备是全窗口对象。它包括标题栏、选单、滚动杆和窗口框架等。定位这个区域的坐标系称为全窗口坐标系,它的原点的左上角。使用函数GetWindowsDC()可以获得该设备对象的句柄,然后通过该句柄使用全窗口坐标系在该区域中绘图。应用程序一般不在这个区域中绘图。
  第三个抽象设备是整个屏幕对象,其坐标原点在屏幕的左上角,定位该区域的设备坐标系称为屏幕坐标系。使用语句:

  HDC hDC = CreateDC("DISPLAY", NULL, NULL, NULL);

可以获得该设备对象的句柄,使用该句柄的GDI函数所使用的坐标是相对于屏幕坐标系。
  这三种坐标系方便了程序在不同的区域绘制图形的需要。例如,由于使用用户区坐标系,即使窗口在屏幕上被移动到其他位置,但用户区中显示的信息相对于用户坐标系而言其坐标值不变。
  使用坐标系,解决了显示对象的定位的问题的。但以象素单位所建立的坐标系不符合用户(或程序员)的习惯,而且在不同分
补充:软件开发 , C语言 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,