怎么给不规则的封闭图形田上颜色?在picture控件里用Line画了一个不规则的图形,现在要给这个图形田上颜色,请问应该怎么做? 谢谢

解决方案 »

  1.   

    to Dunzip(雁过留声) :能详细点吗?
      

  2.   

    上面的方法是用API,这个要详细就很忒麻烦了。不过你的可以用简单的方法,就是取得区域中间的一个点的基色,把周边基色相同的点的基色改变成你要的颜色,直到周边基色相同的点的区域全部修改完成。不知道能不能理解。
      

  3.   

    按照楼主的说法,我认为选用ExtFloodFill、或FloodFill是比较合理的,因为FillRgn需要一个区域句柄,所以还要选建立区域,没必要。ExtFloodFill的用法:http://www.vbgood.com/api-manual/extfloodfill.htmFloodFill的用法:http://www.vbgood.com/api-manual/floodfill.htm
      

  4.   

    to songyaowu:ExtFloodFill、FloodFill这两个函数都要用到一个参数--“设备场景的句柄”,请问这个句柄是怎么设置?
      

  5.   

    两条路:1、动态组合成一个区域(和异形窗体道理一模一样),然后可以FILLRECT。2、自己写代码染色,利用深度或宽度搜索来做,更有挑战性,记住不能直接用递归,以免栈溢出。
      

  6.   

    我举一个特殊的例子,画一个正方形。给它填充颜色。这样为什么不行啊        Picture1.Line (500, 500)-(500, 1000), vbRed
            Picture1.Line (500, 1000)-(1500, 1000), vbRed
            Picture1.Line (1500, 1000)-(1500, 500), vbRed
            Picture1.Line (1500, 500)-(500, 500), vbRed
            
            
            Dim nRet As Long
            nRet = FloodFill(Picture1.hdc, 800, 900, vbYellow)
            If nRet = 0 Then
                    MsgBox "nret1 error!", vbExclamation
            End If
            
            nRet = ExtFloodFill(Picture1.hdc, 800, 900, vbYellow, 0)
            If nRet = 0 Then
                    MsgBox "nret2 error!", vbExclamation
            End If
      

  7.   

    你还是没看懂它的说明,你要了解:
    1.   FloodFill和ExtFloodFill中的颜色(也就是你写的vbYellow)是指到达边界的颜色,而不是填充色。
    2.   所有API中指定的坐标值都应以像素为单位。
    3.   Picture1默认的填充方式是透明,所以即使你上述两项都对了,也看不到效果。
    看下面我修改的你的代码:Private Sub Command1_Click()Picture1.FillColor = vbYellow    ' 将填充色设置为黄色
    Picture1.FillStyle = 0           ' 将填充方式设置为不透明的实体
    Picture1.ScaleMode = 3           ' 将Picture1的坐标单位改为像素        ' 画矩形
            Picture1.Line (50, 50)-(50, 100), vbRed
            Picture1.Line (50, 100)-(150, 100), vbRed
            Picture1.Line (150, 100)-(150, 50), vbRed
            Picture1.Line (150, 50)-(50, 50), vbRed
            
            '' 用FloodFill填充,注意已把你写的vbYellow改为上面画线的颜色vbRed了
            Dim nRet As Long
            nRet = FloodFill(Picture1.hdc, 80, 90, vbRed)
            If nRet = 0 Then
                    MsgBox "nret1 error!", vbExclamation
            End If
            
            '' 用ExtFloodFill填充,同样修改了你代码中的边界颜色为画线颜色vbRed
            nRet = ExtFloodFill(Picture1.hdc, 80, 90, vbRed, 0)
            If nRet = 0 Then
                    MsgBox "nret2 error!", vbExclamation
            End IfEnd Sub