第六章 图形基础-2

时间:2007-10-21 14:34:35   来源:中国IT者  作者:ChinaITzhe  编辑:gaopoadmin

使用现有画笔(Stock Pens)
 

当您呼叫这一节中讨论的任何画线函式时,Windows使用装置内容中目前选中的「画笔」来画线。画笔决定线的色彩、宽度和画笔样式,画笔样式可以是实线、点划线或者虚线,内定装置内容中画笔为BLACK_PEN。不管映射方式是什么,这种画笔都画出一个图素宽的黑色实线来。BLACK_PEN是Windows提供的三种现有画笔之一,其他两种是WHITE_PEN和NULL_PEN,NULL_PEN什么都不画。您也可以自己自订画笔。

Windows程式以代号来使用画笔。 Windows表头档案WINDEF.H中包含一个叫做HPEN的型态定义,即画笔的代号,可以定义这个型态的变数(例如hPen):

HPEN hPen ;
呼叫GetStockObject,可以获得现有画笔的代号。例如,假设您想使用名为WHITE_PEN的现有画笔,可以如下取得画笔的代号:

hPen = GetStockObject (WHITE_PEN) ;
现在必须将画笔选进装置内容:

SelectObject (hdc, hPen) ;
目前的画笔是白色。在这个呼叫後,您画的线将使用WHITE_PEN,直到您将另外一个画笔选进装置内容或者释放装置内容代号为止。

您也可以不定义hPen变数,而将GetStockObject和SelectObject呼叫合并成一个叙述:

SelectObject (hdc, GetStockObject (WHITE_PEN)) ;
如果想恢复到使用BLACK_PEN的状态,可以用一个叙述取得这种画笔的代号,并将其选进装置内容:

SelectObject (hdc, GetStockObject (BLACK_PEN)) ;
SelectObject的传回值是此呼叫前装置内容中的画笔代号。如果启动一个新的装置内容并呼叫

hPen = SelectObject (hdc, GetStockobject (WHITE_PEN)) ;
则装置内容中的目前画笔将为WHITE_PEN,变数hPen将会是BLACK_PEN的代号。以後通过呼叫

SelectObject (hdc, hPen) ;
就能够将BLACK_PEN选进装置内容。

画笔的建立、选择和删除
 

尽管使用现有画笔非常方便,但却受限於实心的黑画笔、实心的白画笔或者没有画笔这三种情况。如果想得到更丰富多彩的效果,就必须建立自己的画笔。

这一过程通常是:使用函式CreatePen或CreatePenIndirect建立一个「逻辑画笔」,这仅仅是对画笔的描述。这些函式传回逻辑画笔的代号;然後,呼叫SelectObject将画笔选进装置内容。现在,就可以使用新的画笔来画线了。在任何时候,都只能有一种画笔选进装置内容。在释放装置内容(或者在选择了另一种画笔到装置内容中)之後,就可以呼叫DeleteObject来删除所建立的逻辑画笔了。在删除後,该画笔的代号就不再有效了。

逻辑画笔是一种「GDI物件」,它是您可以建立的六种GDI物件之一,其他五种是画刷、点阵图、区域、字体和调色盘。除了调色盘之外,这些物件都是通过SelectObject选进装置内容的。

在使用画笔等GDI物件时,应该遵守以下三条规则:

最後要删除自己建立的所有GDI物件。
 
当GDI物件正在一个有效的装置内容中使用时,不要删除它。
 
不要删除现有物件。
 
这些规则当然是有道理的,而且有时这道理还挺微妙的。下面我们将举些例子来帮助理解这些规则。

CreatePen函式的语法形如:

hPen = CreatePen (iPenStyle, iWidth, crColor) ;
其中,iPenStyle参数确定画笔是实线、点线还是虚线,该参数可以是WINGDI.H表头档案中定义的以下识别字,图5-14显示了每种画笔产生的画笔样式。


对於PS_SOLID、PS_NULL和PS_INSIDEFRAME画笔样式,iWidth参数是画笔的宽度。iWidth值为0则意味著画笔宽度为一个图素。现有画笔是一个图素宽。如果指定的是点划线或者虚线式画笔样式,同时又指定一个大於1的实际宽度,那么Windows将使用实线画笔来代替。

CreatePen的crColor参数是一个COLORREF值,它指定画笔的颜色。对於除了PS_INSIDEFRAME之外的画笔样式,如果将画笔选入装置内容中,Windows会将颜色转换为设备所能表示的最相近的纯色。PS_INSIDEFRAME是唯一一种可以使用混色的画笔样式,并且只有在宽度大於1的情况下才如此。

在与定义一个填入区域的函式一起使用时,PS_INSIDEFRAME画笔样式还有另外一个奇特之处:对於除了PS_INSIDEFRAME以外的所有画笔样式来说,如果用来画边界框的画笔宽度大於1个图素,那么画笔将居中对齐在边界框线上,这样边界框线的一部分将位於边界框之外;而对於PS_INSIDEFRAME画笔样式来说,整条边界框线都画在边界框之内。

您也可以通过建立一个型态为LOGPEN(「逻辑画笔」)的结构,并呼叫CreatePenIndirect来建立画笔。如果您的程式使用许多能在原始码中初始化的画笔,那么使用这种方法将有效得多。

要使用CreatePenIndirect,首先定义一个LOGPEN型态的结构:

LOGPEN logpen ;
此结构有三个成员:lopnStyle(无正负号整数或UINT)是画笔样式,lopnWidth(POINT结构)是按逻辑单位度量的画笔宽度,lopnColor (COLORREF)是画笔颜色。Windows只使用lopnWidth结构的x值作为画笔宽度,而忽略y值。

将结构的位址传递给CreatePenIndirect结构就可以建立画笔了:

hPen = CreatePenIndirect (&logpen) ;
注意,CreatePen和CreatePenIndirect函式不需要装置内容代号作为参数。这些函式建立与装置内容没有联系的逻辑画笔。直到呼叫SelectObject之後,画笔才与装置内容发生联系。因此,可以对不同的设备(如萤幕和印表机)使用相同的逻辑画笔。

1 2 3 4 5 6 7 下一页
关键字:Windows,程式,开发,入门,图形基础

相关文章

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面