如何填充任意封闭区域
编号:QA000121
建立日期: 1998年11月21日 最后修改日期:2003年11月15日
所属类别:
Q
NWQ:
不知如何填充任意封闭区域,好象不是FILLCOLOR属性,但我又不知是什么?
A回答:
FillColor属性用在VB中绘制圆和矩形时决定填充的颜色。如果想填充任意区域要借助Windows API。Windows API中有两组用于填充,一组是利用区域函数,另一组是利用ExtFloodFill函数。
Windows API允许使用CreatePolygonRgn等函数创建区域,可以是矩形、椭圆、多边形和其他形状,这些形状还可以使用CombineRgn来进行组合。然后使用FillRgn进行填充。下面给出一个简单的例子,使用FillRgn来填充一个三角区域。
首先,建立一个模块,输入下面的代码:
Type POINTAPI
x As Long
y As Long
End Type
Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint As Any, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
Declare Function Polygon Lib "gdi32" (ByVal hdc As Long, lpPoint As Any, ByVal nCount As Long) As Long
Declare Function FillRgn Lib "gdi32" (ByVal hdc As Long, ByVal hRgn As Long, ByVal hBrush As Long) As Long
Declare Function GetStockObject Lib "gdi32" (ByVal nIndex As Long) As Long
Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Public Const ALTERNATE = 1 ' ALTERNATE and WINDING are
Public Const WINDING = 2 ' constants for FillMode.
Public Const BLACKBRUSH = 4
然后在Form中输入以下代码,这样每次你单击窗体都可以看见一个填充的三角形。
Private Sub Form_Click()
' 定义顶点坐标数组
ReDim poly(1 To 3) As POINTAPI
' Number of vertices in polygon.
NumCoords = 3
' 设置scalemode属性为pixels(像素),然后指定三角形的各顶点
Form1.ScaleMode = 3
' Assign values to points.
poly(1).x = Form1.ScaleWidth / 2
poly(1).y = Form1.ScaleHeight / 2
poly(2).x = Form1.ScaleWidth / 4
poly(2).y = 3 * Form1.ScaleHeight / 4
poly(3).x = 3 * Form1.ScaleWidth / 4
poly(3).y = 3 * Form1.ScaleHeight / 4
' 设置背景色为白色
Form1.BackColor = vbWhite
' Polygon函数创建未填充的多边形
' 如果注释掉下面FillRgn那行,就可以看到不填充的多边形
bool = Polygon(Form1.hdc, poly(1), NumCoords)
' 获得黑色画刷
hBrush = GetStockObject(BLACKBRUSH)
' 为了填充颜色创建区域
hRgn = CreatePolygonRgn(poly(1), NumCoords, ALTERNATE)
' 通过创建成功就使用颜色填充
If hRgn Then bool = FillRgn(Form1.hdc, hRgn, hBrush)
' 输出一些信息
Print "FillRgn Return : "; bool
Print "HRgn : "; hRgn
Print "Hbrush : "; hBrush
Trash = DeleteObject(hRgn)
End Sub
另一种方法是利用ExtFloodFill函数。这个函数有两种填充方式,一个是按照边界颜色填充区域,另一个是将一种颜色换成另一种填充方式。详见Windows API帮助。
李忠银问:专家们曾经就“如何填充任意区域的问题”给我们提供了帮助,深表感谢,但我看了之后仍有不解之处:1、如何控制边界的颜色?2、填充的颜色如何把握?我参考了api对setStockobject的帮助,其中提到了大量的画笔常量,那么请问如何将这些常量与系统调色板256色对应起来呢?3、填充模式交替填充与根据绘图方向填充的区别?
答:边界的颜色不是由FillRgn负责,这个函数只管填充。边界可以使用Polyline绘制。填充的颜色可以通过CreateSolidBrush函数创建Brush对象来解决。下面是一个简单的例子:
Dim hBrush As Long
hBrush = CreateSolidBrush(vbRed)
hRgn = CreatePolygonRgn(Poly(1), 3, ALTERNATE)
FillRgn Me.hDC, hRgn, hBrush
DeleteObject hRgn
DeleteObject hBrush
Polyline Me.hDC, Poly(1), 3
ALTERNATE填满每一个与端点相邻的空间,WINDING 填满整个区域。
殷德利:我用 vb画图,画出了多边形,请问我该怎么用api数把这个多边形填充起来,polygon他的坐标系怎么和vb中自定义的坐标系对应起来。请您帮忙,回复一下,谢谢!
答:前面例子中Form1.ScaleMode = 3一句设置scalemode属性为pixels(像素)就是将API默认的坐标系和vb中使用的坐标系对应起来。
此问题由李海回答。
附加关键字:编程, 源程序, programming, source code, Visual Basic, VB, Windows API, win32, api, windows api, gdi32, kernel, 图形、图象, picture, graph, image, draw。
| |
|
|
| |
|
|