热情软件屋

 

如何填充任意封闭区域


编号:QA000121
建立日期: 1998年11月21日 最后修改日期:2003年11月15日
所属类别:

NWQ:
    不知如何填充任意封闭区域,好象不是FILLCOLOR属性,但我又不知是什么?
    

回答:

    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

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio