想给扇形填充渐变色在网上查到利用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
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
不是这个原因~
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
原贴出处:
http://community.csdn.net/Expert/topic/5470/5470835.xml?temp=.0212366你的问题:
1、第一个参数是DC,不是hwnd,Form1.hWnd==>Form1.hdc
2、在Form_load中调用的话,请将autoRedraw=true
我把Form1.hWnd==>Form1.hdc 改好了,autoRedraw=true之前就设置好了,我用的也是VB6.0版本
但是运行后还是不出图形~~
请换个坐标,如:DrawGradientCircle Form1.hdc, 200, 200, 100, 13301246, 8721863, , , 36
我只是让你修改圆心坐标,让画的东西在窗体的可视范围内。还有,没看到你的GRADIENT_FILL_TRIANGLE声明,这个常数值是2
请补上
Private Const GRADIENT_FILL_TRIANGLE = &H2&若我没猜错,你一定是没用 Option Explicit,这是个极不好的习惯,没声明变量或常量,也不出错提示,会让你很难找到错误原因!
加了一个Private Const GRADIENT_FILL_TRIANGLE = &H2,改了一下调用Private Sub Form_load()
Me.AutoRedraw = True
DrawGradientCircle Me.hDC, 100, 100, 100, 13301246, 8721863, , , 36End Sub
很正常呀。你也新建一个工程试试。
我估计我之前去改属性什么的,哪里改错了,然后再用加Option Explicit和Private Const GRADIENT_FILL_TRIANGLE = &H2&之后仍然不对那就是说自定义的坐标系上也可以用呀。但是试了下没出图形,我想可能是我的坐标值太大了,是不是用这个函数时,坐标系有限制阿?那是不能超过1000*1000吗?
Picture1.Scale (0, 3200)-(6400, -3200)
作图也是在picture1上。问题1:但是我设置画扇形图的坐标时,x,y,r的值都强制转换成长整型就可以了么?2:但是仍然有问题,比如y也许取负值,而且这样通过这个渐近色函数,(x,y)表示的值就是自定义坐标系上的点么?3:x,y,r很有可能超过1000,那么把它们缩小一个倍数使得能用像素坐标系显示,那此刻的坐标就不一定是自定义系中的需要的那个点坐标了吧。4:查书,也说pixel,像素是依赖于屏幕的,那要是屏幕改变,是只改变颜色,还是连坐标长短等都会改变呢?
这几点,想来想去越来越混乱了。