想给扇形填充渐变色在网上查到利用GradientFillTriangle给圆形填充渐变色的代码DrawGradientCircle,于是稍微修改了一下就拿来用但是,运行了没有提示出错,但也没有结果,就是没有图显示并且,开始直接试用圆形渐变色的原代码DrawGradientCircle也没有图显示出来调试了很久还是不知道原因,不知道是不是填充对象的窗口句柄用错了。原来的圆形渐变色子程序名为
Public Sub DrawGradientCircle(dhDC As Long, CenterX As Long, CenterY As Long, Radius As Long, _
    StartColor As Long, Optional EndColor As Long = -1, Optional ByVal Alpha As Byte = 192, _
    Optional Inner As Boolean, Optional TriangleCount As Long = 36)我调用它的时候用的:
Private Sub Form_load()
DrawGradientCircle Form1.hWnd, 200, 200, 100, 13301246, 8721863, , , 36
End Sub

解决方案 »

  1.   

    已经设置了autoRedraw为true了的
    不是这个原因~
      

  2.   

    有没有人知道哪里错了呀~~,在线等~具体的程序我都写出来吧:(圆形渐变色的原代码,不知道为啥不出图)Private Type TRIVERTEX
        x As Long
        y As Long
        Red(1) As Byte
        Green(1) As Byte
        Blue(1) As Byte
        Alpha(1) As Byte
    End TypePrivate Type GRADIENT_TRIANGLE
        Vertex1 As Long
        Vertex2 As Long
        Vertex3 As Long
    End TypePrivate Declare Function GradientFillTriangle Lib "msimg32" _
    Alias "GradientFill" (ByVal hDC As Long, pVertex As TRIVERTEX, ByVal dwNumVertex As Long, _
    pMesh As GRADIENT_TRIANGLE, ByVal dwNumMesh As Long, ByVal dwMode As Long) As Long
    Public Sub DrawGradientCircle(dhDC As Long, CenterX As Long, CenterY As Long, Radius As Long, _
        StartColor As Long, Optional EndColor As Long = -1, Optional ByVal Alpha As Byte = 192, _
        Optional Inner As Boolean, Optional TriangleCount As Long = 36)
        
        Dim Vertex() As TRIVERTEX
        Dim Triangle() As GRADIENT_TRIANGLE
        Dim Red(1) As Long, Green(1) As Long, Blue(1) As Long
        Dim Theta As Double
        Dim i As Long, j As Long
        'CenterX,CenterY 圆心坐标
        'Radius 半径
        'StartColor起始填充色
        'EndColor结束填充色,它是可选的,若小于零时忽略此参数,使用Alpha基于StartColor算出EndColor,实现高度填充效果
        'Alpha用于计算StartColor的高亮色,0-255之间,越大越亮,若设置了EndColor,则忽略此参数
        'Inner为渐变方式,为True时,StartColor到EndColor(或是alpha计算出的)颜色,按从外向内渐变,False则相反
        'TriangleCount为三角形数量,默认为36个
        Red(0) = StartColor And &HFF
        Green(0) = (StartColor And &HFF00&) \ &H100&
        Blue(0) = (StartColor And &HFF0000) \ &H10000
        If EndColor < 0 Then
            If Alpha < 0 Then Alpha = 0
            Red(1) = (Red(0) * (256 - Alpha) + 255 * Alpha) \ 256
            Green(1) = (Green(0) * (256 - Alpha) + 255 * Alpha) \ 256
            Blue(1) = (Blue(0) * (256 - Alpha) + 255 * Alpha) \ 256
        Else
            Red(1) = EndColor And &HFF
            Green(1) = (EndColor And &HFF00&) \ &H100&
            Blue(1) = (EndColor And &HFF0000) \ &H10000
        End If
        If TriangleCount < 12 Then TriangleCount = 12
        '设置所有三角形共有一个位于圆心的顶点
        ReDim Vertex(TriangleCount)
        With Vertex(0)
            .x = CenterX
            .y = CenterY
            If Inner Then
                j = 1
            Else
                j = 0
            End If
            .Red(1) = Red(j)
            .Green(1) = Green(j)
            .Blue(1) = Blue(j)
            j = 1 - j
        End With
        '设置所有位于圆周上的三角形其它顶点,因三角形一个连一个,所以圆周上顶点数与三角形数是一样的
        Theta = (3.1415926 * 2 / TriangleCount)
        For i = 1 To TriangleCount
            With Vertex(i)
                .x = CenterX + Radius * Cos((i - 1) * Theta)
                .y = CenterY + Radius * Sin((i - 1) * Theta)
                .Red(1) = Red(j)
                .Green(1) = Green(j)
                .Blue(1) = Blue(j)
            End With
        Next
        
        '设置每个三角形结构,为它们指定顶点
        ReDim Triangle(TriangleCount - 1)
        For i = 0 To TriangleCount - 1
            Triangle(i).Vertex1 = 0
            j = i + 1
            Triangle(i).Vertex2 = j
            j = i + 2
            If j > TriangleCount Then j = 1
            Triangle(i).Vertex3 = j
        Next
        GradientFillTriangle dhDC, Vertex(0), TriangleCount + 1, Triangle(0), TriangleCount, GRADIENT_FILL_TRIANGLE
    End Sub'处理好顶点与三角形或矩形,一次性传入,GradientFillTriangle能干的事情太多了,现在各种漂亮的界面,包括水晶效果都能用它绘出来,但愿这个函数能把那些还沉迷于描点画线做渐变的朋友们唤醒。
    '有兴趣的朋友可把这个函数改一改,让它支持扇形渐变,当然,若能改成基于椭圆公式填充就更好了。Private Sub Form_load()DrawGradientCircle Form1.hWnd, 1000, 1000, 100, 13301246, 8721863, , , 36End Sub
      

  3.   

    晕了,这是我才写的,你在网上都查到了?
    原贴出处:
    http://community.csdn.net/Expert/topic/5470/5470835.xml?temp=.0212366你的问题:
    1、第一个参数是DC,不是hwnd,Form1.hWnd==>Form1.hdc
    2、在Form_load中调用的话,请将autoRedraw=true
      

  4.   

    呵呵~ 谢谢,正是看了你的帖子 =p
    我把Form1.hWnd==>Form1.hdc  改好了,autoRedraw=true之前就设置好了,我用的也是VB6.0版本
    但是运行后还是不出图形~~

      

  5.   

    你的窗口有多大?超过1000X1000像素了吗?你不会画到窗体之外了吧?圆心坐标单位是像素,不是缇!
    请换个坐标,如:DrawGradientCircle Form1.hdc, 200, 200, 100, 13301246, 8721863, , , 36
      

  6.   

    哦~谢谢修改scalemode为pixel,但是显示出来的图形非常奇怪图形是很不规则的,而且一直是黑的,修改startcolor 和 endcolor的值,结果改变的是图形形状,但是在运行中输出startcolor和endcolor的值又没有问题,哎,还是不知道问题出在哪了~~
      

  7.   

    不用修改scalemode,改不改,都是以pixel为单位的,因为这是使用GDI函数的
    我只是让你修改圆心坐标,让画的东西在窗体的可视范围内。还有,没看到你的GRADIENT_FILL_TRIANGLE声明,这个常数值是2
    请补上
    Private Const GRADIENT_FILL_TRIANGLE = &H2&若我没猜错,你一定是没用 Option Explicit,这是个极不好的习惯,没声明变量或常量,也不出错提示,会让你很难找到错误原因!
      

  8.   

    ....我用了Option Explicit的,也声明了Private Const GRADIENT_FILL_TRIANGLE = &H2&的,因为会报错的。还是没有改善~
      

  9.   

    真是奇了怪了,我新建一个工程,完全试了你上面的代码
    加了一个Private Const GRADIENT_FILL_TRIANGLE = &H2,改了一下调用Private Sub Form_load()
    Me.AutoRedraw = True
    DrawGradientCircle Me.hDC, 100, 100, 100, 13301246, 8721863, , , 36End Sub
    很正常呀。你也新建一个工程试试。
      

  10.   

    呵呵~没有~~
    我估计我之前去改属性什么的,哪里改错了,然后再用加Option Explicit和Private Const GRADIENT_FILL_TRIANGLE = &H2&之后仍然不对那就是说自定义的坐标系上也可以用呀。但是试了下没出图形,我想可能是我的坐标值太大了,是不是用这个函数时,坐标系有限制阿?那是不能超过1000*1000吗?
      

  11.   

    比如说,我的坐标系设的是:
    Picture1.Scale (0, 3200)-(6400, -3200)
    作图也是在picture1上。问题1:但是我设置画扇形图的坐标时,x,y,r的值都强制转换成长整型就可以了么?2:但是仍然有问题,比如y也许取负值,而且这样通过这个渐近色函数,(x,y)表示的值就是自定义坐标系上的点么?3:x,y,r很有可能超过1000,那么把它们缩小一个倍数使得能用像素坐标系显示,那此刻的坐标就不一定是自定义系中的需要的那个点坐标了吧。4:查书,也说pixel,像素是依赖于屏幕的,那要是屏幕改变,是只改变颜色,还是连坐标长短等都会改变呢?
    这几点,想来想去越来越混乱了。