C++编程中Windows图像编程概要.pdf
《C++编程中Windows图像编程概要.pdf》由会员分享,可在线阅读,更多相关《C++编程中Windows图像编程概要.pdf(15页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C+编程中W i n d o w s 图像编程概要(2 0 0 6-0 8-2 1)-C S D N -最近更新()牋图形设备接口(G D I,G r a p h i c s D e v i c e I n t e r f a c e)的主要目标之一是支持在输出设备(如视频显示器、打印机和绘图仪)上的与设备无关的图形。G D I 通过将应用程序与不同输出设备特性相隔离,使W i n d o w s 应用程序能够毫无问题地在W i n d o w s 支持的任何图形输出设备上运行。W i n d o w s 中的图形基本上是由从G D I E X E 模块中输出的函数处理的(尽管一些绘制函数实际
2、上具有U S E R E X E 的入口点),G D I E X E 模块调用在不同驱动程序文件中的例程,其中有一个D R V 驱动程序文件用于控制显示屏幕,并且可能有一个或多个其他的D R V 驱动程序文件用来控制打印机或绘图仪。W i n d o w s G D I 使用两种坐标系统。使用虚拟坐标系统可以使程序不依赖于具体的硬件,使用设备坐标系统可以使程序和硬件紧密相联。G D I 含有在W i n d o w s 应用程序内部执行、且与设备无关的图形操作函数,这些函数可产生各种各样的线、正文和位图,它们可以输出到许多不同的输出设备上。G D I 允许一个应用程序产生笔、刷子、字体和位图,
3、以供特定的输出操作使用。下面列出G D I 中几组比较常用的函数:设备上下文函数 椭圆和多边形函数 绘图工具函数 位图函数 绘图属性函数 正文函救 映射函数。坐标函数 元文件(m e t a f i l e)函数 区域函数 裁剪(c l i p p i n g)函?窗口应用程序输出图形的操作步骤如下:取得指定窗口的当前显示设备上下文,显示设备上下文实际上是一个数据结构,它包括该窗口的参数及各种图形、文字属性的现行设定值,它们对以后的图形、文字输出命令起控制作用。选择用户坐标系及映射方式。设定用户坐标系中的观察窗口和设备坐标系中的显示视区。输出图形、文字和图象。释放所使用的显示设备上下文。当想要
4、在图形输出设备(例如屏幕或打印机)上绘制图形时,必须首先获得设备上下文的句柄。先给出这个句柄,W i n d o w s 才允许程序使用设备,在G D I 函数中将句柄作为一个参数传入,向W i n d o w s标明需要使用的设备。设备上下文中包含许多属性,当G D I 在不同的设备上工作时都要用到这些属性。使用这些属性可使G D I 只关心起始和终止坐标的大小,而不必关心有关对象的其他属性,如颜色、背景等等,因为这些都是设备上下文的一部分。当需要修改这些属性时,只需调用一个修改设备上下文中属性的参数,以后的程序中都使用修改后的设备上下文属性。设备上下文是连接W i n d o w s 应用
5、程Page 1/15http:/www.chinavideo.org序、设备驱动程序以及输出设备的纽带。获取设备上下文句柄有多种方法。最一般的方法是当处理一条消息时获得了设备 上下文、并在退出窗口之前释放它。一般的处理方法如下:在处理W M _ P A I N T 消息时 c a s e W M _ P A I N T:h d c=B e g i n P a i n t(h w n d,&p s)/代码 E n d P a i n t (h w n d,&p s);其数据结构为:H D C h W n d;P A I N T S T R U C T p s;而在w i n d o w s h
6、中定义了P A I N T S T R U C T 的数据结构。t y p e s t r u c t t a g P A I N T S T R U C T H D C h d C;B O O L f E r a s e;R E C T r c P a i n t;B O O L f R e s t o r e;B O O L f l n c U p d a t e;B Y T E r g b R e s e r v e d 1 6 ;P A I N T S T R U C T;其中,h d c 用于标识显式上下文,f E r a s e 指出背景是否重画,r c P a i n t 是涂色
7、矩形,其余的域均为保留。这里的h d c 是B e g i n P a i n t 返回的设备上下文句柄,有了从B e g i n P a i n t 获取的设备上下文句柄,就可以也只能在p s 指出的r c P a i n t 的矩形内绘图,E n d P a i n t 调用使这一区域有效。第二种方法如下所示,使用这种方法获取和释放设备上下文可以在整个用户区内画图,图形在整个用户区域内都有效:h d C G e t D c (h w n d );画图操作 R e l e a s e D C (h w n d ,h d c );使用下面第三种方法获取和释放设备上下文,可以在整个窗口内画图,图
8、形在整个窗口内有效:Page 2/15http:/www.chinavideo.orgh d C=G e t W i n d o w D c(h w n d);画图操作 R e l e a s e D c(h w n d,h d c);使用下面第四种方法获取和释放设备上下文,可以在整个显示器区域内画图,图形在整个显示器区域内部有效:h d c C r e a t e D C (l p s z D r i v e r ,l p s z D e v i c e ,l p s z O u t p u t ,l p D a t a);画图操作 R e l e a s e D C(h d c);其中l
9、p s z D r i v e r 指向设备驱动程序的D O S 文件名(不带扩展名),l p s z D e v i c e 指向专用设备名(例如E p s o n F x-8 0),l p s z O u t p u t 指向物理输出介质(文件或输出端口)的D O S 文件名或设备名,l p D a t a 指向含有设备驱动程序的设备专用的初始化数据的D E V M O D E 数据结构。例如:h d c C r e a t e D C(D I S P L A Y ,N U L L,N U L L,N U L L);使用屏幕画图,而:h d c=C r e a t e D C (I B M
10、 G R X ,I B M G r a p h i c s ,L P T 1 ,N U L L );在打印机上输出图形,这里的l p D a t a 置为默认值,可以在W I N I N I 中找到初始化值。如果不需要获取设备上下文,即不需要在设备上下文中操作,只需了解有关设备上 下文的信息,可以用如下语句:h d c I n f o C r e a t e D C (l p s z D r i v e r,l p s z D e v i c e,l p s z O u t p u t,l p D a t a );D e t e t e D C (h d c I n f o);另外,还可以使用
11、设备上下文来对位图的内存进行控制,如下所示:h d c M e m C r e a t e C o m p a t i b l e D C (h d c)D e l e t e D c(h d c M e m );一个元文件是以二进制形式编码的G D I 调用集合,可通过获取一个元文件设备上下文来建立一个文件:h d c M e t a=C r e a t e M e t a F i l e(l p s z F i l e n a m e);h m f=C l o s e M e t a F i l e(h d C M e t a);在元文件设备上下文有效期间,使用h d c M e t a
12、所进行的任何G D I 调用都成为元文件的一部分,当调Page 3/15http:/www.chinavideo.org用C l o s e M e t a F i l e 时,设备上下文句柄变化无效,函数返回元文件(h m f)的句柄。一个设备上下文通常涉及物理设备,如视频显示器、打印机等,所以需要获取有关该设备的信息,如显示器大小和彩色能力等。可以通过调用G e t D e v i c e C a p s 函数来获取这样的信息:n V a l u e=G e t D e v i c e C a p s (h d c,n I n d e x);这里的h d c 标识设备上下文,n I n d
13、 e x 确定返回值,它可以是w i n d o w h 中所定义的2 8 个标识符中的一个,例如n I n d e x=D R I V E V E R S I O N,则该函数返回的是版本号。真正影响在用户区域上绘制过程的设备上下文属性是“映射方式”,与映射方式属性密切相关的还有如下四个设备上下义属性:窗口原点、视窗原点、窗口范围和视窗范围。W i n d o w s 定义了八种映射方式。可以调用函数s e t M a p M o d e(h d c,M a p M o d e)来设置这八种映射方式中的一种。h d c 用来标识设备上下文,n M a p M o d e 可以取M M _ T
14、 E X T、M M _ L O M E T R I C、M M _ H I M E T R I C 等八个中的一个。在设置了映射方式之后,到下一次设置映射方式之前,W i n d o w s 一直使用 这种映射方式。如果想要获取当前的映射方式,可用:n M a p M o d e G e t M a p M o d e (h d c)在设置了映射方式之后,就规定了逻辑单位的大小和增量的方式,在G D I 画图函数中,可以不必考虑这些内容而直接使用逻辑数字,如:S e t M a p M o d e(h d c ,M M _ T E X T);T e x t O u t(h d c,8 ,1
15、6,s z B u f f e r ,n L e n g t h)即正文从用户区域左起第八个象素,顶边起第1 6 个象素的位置开始写操作。不管映射方式如何,W i n d o w s 函数中所有坐标规定为3 2 7 6 8 到 3 2 7 6 7 之间的带符号短整救。注意映射方式只是一个设备上下文属性,因此映射方式唯一起作用的是将映射方式作为设备上下文句柄属性,而将该句柄当作参数的G D I 函数,因此象G e t S y s t e m M e t r i c s 这样的非G D I 函数,将继续以设备单位(象素值)返回尺寸值。用G D I 的S e t P i x e l 函数可以绘制一特
16、定颜色的象素:r g b A c t u a l C o l o r S e t P i x e l (h d c,x,y,r g b C o l o r);这里h d c 标识设备上下文,x ,y 表示点坐标,r g b C o l o r 为一无符号的长整数,其结构为:C O L O R R E F r g b C o l o r;其中低位字节为红基色的相对亮度值,第二个字节包含绿基色的相对亮度值,第三个字节包含蓝基色的相对亮度值,高位字节必须为零。可以使用R G B 函数来获取r g b C o l o r。r g b C o l o r R G B(b y R e d ,b y G r
17、 e e n,b y B l u e);这里的b y R e d、b y G r e e n、b y B l u e 取值范?0 2 5 5,分别代表红色、绿色、蓝色的亮度。给出正确的参数之后,S e t P i x e l 返回的是调色板中最靠近所需彩色的颜色。还可以使用如下方法来取得一个特定象素的颜色:r g b C o t o r=G e t P i x e l(h d c,x,y);画线函数主要有三种,L i n e T o、P o l y l i n e 和 A r c。还有五个设备上下文属性会影响这些函数画出的线的外观:笔的当前位置(仅对L i n e T o 有影响)、笔、背景方
18、式(对非实心笔有影响)、背景颜色(对 O P A Q U E 背景方式)以及绘制方式。在这些设备上下文的属性中,笔的当前位置影响画线的起点,笔影响线的粗细等形状,背景方式影响非实心笔画出的线的模板图形,背景颜色影响线模板背景色,绘制方式影响实心线、虚线等线属性。Page 4/15http:/www.chinavideo.org以下是典型的画线操作步骤:M o v e T o(h d c,x S t a r t,y S t a r t);L i n e T o(h d c ,x E n d ,y E n d);上面两句画出一条从(x S t a r t,y S t a r t)到(x E n d
19、,y E n d)的直线。可以使用语句:d w P o i n t G e t C u r r e n t P o s i t i o n (h d c);获得笔的当前位置。这里,d w P o i n t 返回值是一个无符号长整数(或双倍长字),其中低位字含有X 坐标,高位字含有Y 坐标。可以使用M A K E P O I N T 函数将d w P o i n t 转换为P O I N T 结构;p o i n t =M A K E P O I N T (d w P o i n t);p o i n t 的类型为P O I N T:t y p e d e f s t r u c t t o
20、g P O I N T k k 1 i n t x;i n t y;P O I N T;P o l y l i n e 用于绘制折线,例:P o l y l i n e(h d c,&p t,5)将数组p t 中的5 个点之间用线段相连。A r c 用于画椭圆的周边:A r c (h d c,x L e f t,y T o p,x R i g h t,y B o t t o m,x S t a r t,y S t a r t,X E n d,y E n d );画出的椭圆以左上角为(x L e f t,y T o p),右下角为(x R i g h t,y B o t t o m)的矩形为界,
21、圆弧开始于椭圆和(x S t a r t,y S t a r t)与椭圆中心的连线的交点处,沿着椭圆周边的过时针方向绘制,并终止于椭圆和(x E n d,y E n d)与椭圆中小的连线的交点处。当调用L i n e T o、P o l y l i n e 和A r c 时,W i n d o w s 使用当前在设备上下文中选择的笔来画线,笔决定了线的颜色、密度和型式,而线型可以是实线、点线或短划(虚)线,缺省设备上下文中的笔叫做B L A C K _ P E N,不管映射方式如何选支笔以一个象素的宽度画黑色的实线,B L A C K _ P E N 是W i n d o w s 提供的三支“
22、备用笔”之一,其他两支是W H I T E _ P E N和N U L L _ P E N,N U L L _ P E N 是一支什么都不画的空笔,当然用户也可以自己建立定制的笔。可以通过一个句柄来引用所需的笔:H P E N h P e n;h P e n G e t S t o c k O b j e c t(W H I T E _ P E N);S e l e c t O b j e c t(h d c ,h P e n);Page 5/15http:/www.chinavideo.org调用G e t S t o c k O b j e c t 获得一支备用笔(W H I T E _
23、P E N)的句柄,调用S e l e c t O b j e c t 使这支笔成为设备上下文中当前选择的,用C r e a t e P e n 或C r e a t e P e n I n d i r e c t 函数建立一支“逻辑笔”,这逻辑笔只是一支笔的描述。h P e n =C r e a t e P e n (n P e n S t y l e ,n W i d t h ,r g b C o l o r );其中n P e n S t y l e 参数确定笔是绘制实线还是由点或短划组成的线。该参数可取下 列标识符之一:P S _ S O L I D、P S _ D A S H、P s
24、 _ D O T、P S _ D A S H D O T、P S _ D A S H D O T D O T。n W i d t h 表示笔宽(采用逻辑单位),r g b C o l o r 表示笔的颜色,如果函数执行成功,则返回值标识一支逻辑笔,否则返回值为N U L L。另外还有一种方法来建立逻辑笔:t y p e d e f s t r u c t t a g L O G P E N k k 1 P O I N T l o p n W i d t h;C O L O R R E F l o p n C o l o r;L O G P E N;以上是W i n d o w s h 中对L
25、O G P E N 结构的定义。l o p n S t y l e 规定笔的型式,l o p n W i d t h 规定笔的宽度,l o p n C o l o r 规定笔的颜色。然后将l o g p e n 定义为L O G P E N 类型:L O G P E N l o g p e n;再使用h P e n C r e a t e P e n l n d i r e c t (l o g p e n);就可以建立自定义的笔了。因为用以上两种方式建立的笔不是设备上下文有关的,所以可以同时建立多支笔,并用多支笔画图。h p e n l C r e a t e P e n(P S _ S O
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 编程 Windows 图像 概要
限制150内