Windows图形基础(二)
来源:互联网 发布:小红帽q群优化软件 编辑:程序博客网 时间:2024/06/10 22:18
一、绘制填入区域
现在再更进一步,从画线到画图形。Windows中七个用来画带边缘的填入图形的函数列于下表中。
函数
图形
Rectangle
直角矩形
Ellipse
椭圆
RoundRect
圆角矩形
Chord
椭圆周上的弧,两端以弦连接
Pie
椭圆上的饼图
Polygon
多边形
PolyPolygon
多个多边形
Windows用设备内容中选择的目前画笔来画图形的边界框,边界框还使用目前背景方式、背景色彩和绘图方式,这跟Windows画线时一样。关于直线的一切也适用于这些图形的边界框。
图形以目前设备内容中选择的画刷来填入。内定情况下,使用现有对象,这意味着图形内部将画为白色。Windows定义六种现有画刷:WHITE_BRUSH、LTGRAY_BRUSH、GRAY_BRUSH、DKGRAY_BRUSH、BLACK_BRUSH和NULL_BRUSH (也叫HOLLOW_BRUSH)。您可以将任何一种现有画刷选入您的设备内容中,就和您选择一种画笔一样。Windbws将HBRUSH定义为画刷的句柄,所以可以先定义一个画刷句柄变量:
HBRUSH hBrush ;
您可以通过呼叫GetStockObject来取得GRAY_BRUSH的句柄:
hBrush = GetStockObject (GRAY_BRUSH) ;
您可以呼叫SelectObject将它选进设备内容:
SelectObject (hdc, hBrush) ;
现在,如果您要画上表中的任一个图形,则其内部将为灰色。
如果您想画一个没有边界框的图形,可以将NULL_PEN选进设备内容:
SelectObject (hdc, GetStockObject (NULL_PEN)) ;
如果您想画出图形的边界框,但不填入内部,则将NULL_BRUSH选进设备内容:
SelectObject (hdc, GetStockobject (NULL_BRUSH) ;
您也可以自订画刷。
二、Polygon函数和多边形填入方式
我已经讨论过了前五个区域填入函数,Polygon是第六个画带边界框的填入图形的函数,该函数的呼叫与Polyline函数相似:
Polygon (hdc, apt, iCount) ;
其中,apt参数是POINT结构的一个数组,iCount是点的数目。如果该数组中的最后一个点与第一个点不同,则Windows将会再加一条线,将最后一个点与第一个点连起来(在Polyline函数中,Windows不会这么做)。PolyPolygon函数如下所示:
PolyPolygon (hdc, apt, aiCounts, iPolyCount) ;
该函数绘制多个多边形。最后一个参数给出了所画的多边形的个数。对于每个多边形,aiCounts数组给出了多边形的端点数。apt数组具有全部多边形的所有点。除传回值以外,PolyPolygon在功能上与下面的代码相同:
for (i = 0, iAccum = 0 ; i < iPolyCount ; i++) { Polygon (hdc, apt + iAccum, aiCounts[i]) ; iAccum += aiCounts[i] ; }
对于Polygon和PolyPolygon函数,Windows使用定义在设备内容中的目前画刷来填入这个带边界的区域。至于填入内部的方式,则取决于多边形填入方式,您可以用SetPolyFillMode函数来设定:
SetPolyFillMode (hdc, iMode) ;
内定情况下,多边形填入方式是ALTERNATE,但是您可以将它设定为WINDING。两种方式的区别参见图5-15所示。
图5-15 用两种多边形填入方式画出的图:ALTERNATE(左)和WINDING(右)
首先,ALTERNATE和WINDING方式之间的区别很容易察觉。对于ALTERNATE方式,您可以设想从一个无穷大的封闭区域内部的点画线,只有假想的线穿过了奇数条边界线时,才填入封闭区域。这就是填入了星的角而中心没被填入的原因。五角星的例子使得WINDING方式看起来比实际上更简单一些。在绘制单个的多边形时,大多数情况下,WINDING方式会填入所有封闭的区域。
三、矩形函数
下面三个绘图函数需要一个指向矩形结构的指针:
FillRect (hdc, &rect, hBrush) ; FrameRect (hdc, &rect, hBrush) ; InvertRect (hdc, &rect) ;
在这些函数中,rect参数是一个RECT型态的结构,它包含有4个字段:left、top、right和bottom。这个结构中的坐标被当作逻辑坐标。
FillRect用指定画刷来填入矩形(直到但不包含right和bottom坐标),该函数不需要先将画刷选进设备内容。
FrameRect使用画刷画矩形框,但是不填入矩形。使用画刷画矩形看起来有点奇怪,因为对于我们所介绍过的函数(如Rectangle),其边线都是用目前画笔绘制的。FrameRect允许使用者画一个不一定为纯色的矩形框。该边界框为一个逻辑单位元宽。如果逻辑单位大于设备单位,则边界框将会为2个图素宽或者更宽。
InvertRect将矩形中所有图素翻转,1转换成0,0转换为1,该函数将白色区域转变成黑色,黑色区域转变为白色,绿色区域转变成洋红色。
Windows还提供了9个函数,使您可以更容易、更清楚地操作RECT结构。例如,要将RECT结构的四个字段设定为特定值,通常使用如下的程序段:
rect.left = xLeft ; rect.top = xTop ; rect.right = xRight ; rect.bottom = xBottom ;
但是,通过呼叫SetRect函数,只需要一道叙述就可以得到同样的结果:
SetRect (&rect, xLeft, yTop, xRight, yBottom) ;
在您想要做以下事情之一时,可以很方便地选用其它8个函数:
- 将矩形沿x轴和y轴移动几个单元:
OffsetRect (&rect, x, y) ;
- 增减矩形的尺寸:
InflateRect (&rect, x, y) ;
- 矩形各字段设定为0:
SetRectEmpty (&rect) ;
- 将矩形复制给另一个矩形:
CopyRect (&DestRect, &SrcRect) ;
- 取得两个矩形的交集:
IntersectRect (&DestRect, &SrcRect1, &SrcRect2) ;
- 取得两个矩形的联集:
UnionRect (&DestRect, &SrcRect1, &SrcRect2) ;
- 确定矩形是否为空:
bEmpty = IsRectEmpty (&rect) ;
- 确定点是否在矩形内:
bInRect = PtInRect (&rect, point) ;
大多数情况下,与这些函数相同作用的程序代码很简单。例如,您可以用下列叙述来替代CopyRect函数呼叫:
DestRect = SrcRect ;
- Windows图形基础(二)
- Windows图形基础(一)
- Windows学习笔记10——图形基础<二>
- windows图形基础---Win32
- windows程序设计:图形基础
- OpenGL基础图形编程(二)
- Windows程序设计之图形基础
- Android图形绘制基础(二)
- Windows编程的图形基础(一)HDC, HPEN, HBRUSH
- java基础整理二十二(图形化界面)
- C#学习之GDI + 图形编程基础(二)
- OpenGL基础图形编程(二)OpenGL概念建立
- Java基础复习---异常练习(二):实现图形面积
- C语言基础(二)图形编程2
- Android:图形(二)
- Windows程式开发设计指南--图形基础
- windows程序设计第五章 图形基础
- 第四章 Windows游戏图形基础
- Java基本数据类型转换 [转]
- 关联容器(Associative Container)
- 利用Hibernate编写通用的数据库操作代码
- 分子生物学词汇
- .net一些基本概念
- Windows图形基础(二)
- 追求平均年报酬率10% 老美观点可借镜
- Oracle中动态建表--学习笔记
- Ten Ways to Cheer Up
- ecos kernel 分析
- 常用正则表达式
- 花样贝塞尔曲线(C#)
- 【转贴】一个垃圾程序员的创业梦
- 递归回溯--八皇后问题