跪求GDI+在VB6.0环境下 画扇形的函数及使用方法

时间:2022-11-08 10:58:39
跪求GDI+在VB6.0环境下 画扇形的函数及使用方法

这个问题我百度了很久,也没查到这个函数,及函数的具体用法。
我参考画圆的函数试着声明了这样的画扇形函数
画圆的函数:Public Declare Function  GdipDrawEllipseI Lib "gdiplus" (ByVal Graphics As Long, ByVal pen As Long, ByVal x As Long, ByVal y As Long, ByVal Width As Long, ByVal Height As Long) As GpStatus
没查到画扇形的函数,我试着凑了一个:Public Declare Function  GdipDrawPie Lib "gdiplus" (ByVal Graphics As Long, ByVal pen As Long, ByVal x As Single, ByVal y As Single, ByVal Width As Single, ByVal Height As Single, ByVal X3 As Long, ByVal Y3 As Long) As GpStatus居然没有报错,但是,结果却画出了一个圆。
苦逼啊,有哪位高手可以求解吗?我的邮箱是chinacohit@163.COM QQ 1002031672

11 个解决方案

#1


不需要GDI+,是直接用GDI,画扇形,其实,就是API,画圆形,加参数,就能画扇形,半透明,用其它方法可以实现

#2


Public Sub 画圆(hDc As Long, ByVal 圆心X As Long, ByVal 圆心Y As Long, ByVal 宽度 As Long, ByVal 高度 As Long, _
           ByVal 度起点 As Long, ByVal 度终点 As Long, ByVal 框线粗细 As Long, ByVal 线条类型 As 线条类型_m, ByVal 边框色 As Long, ByVal 填充色 As Long)
Dim pBrush As Long, pPen As Long
Dim X1 As Long, X2 As Long, X3 As Long, x4 As Long
Dim Y1 As Long, Y2 As Long, Y3 As Long, y4 As Long
Dim A As Single

X1 = 圆心X - 宽度 / 2
X2 = 圆心X + 宽度 / 2

Y1 = 圆心Y - 高度 / 2
Y2 = 圆心Y + 高度 / 2

A = 3.14159265 / 180  '为了将角度转换为弧度
X3 = 圆心X + (宽度 * Sin(度起点 * A))
Y3 = 圆心Y - (高度 * Cos(度起点 * A))

x4 = 圆心X + (宽度 * Sin(度终点 * A))
y4 = 圆心Y - (高度 * Cos(度终点 * A))

pBrush = SelectObject(hDc, CreateSolidBrush(填充色))
pPen = SelectObject(hDc, CreatePen(线条类型, 框线粗细, 边框色))

If 填充色 < 0 Then
Call Arc(hDc, X1, Y1, X2, Y2, X3, Y3, x4, y4)
Else
Call Pie(hDc, X1, Y1, X2, Y2, X3, Y3, x4, y4)
End If
Call DeleteObject(SelectObject(hDc, pBrush))
Call DeleteObject(SelectObject(hDc, pPen))
End Sub

#3


半透明,可以先将扇形画到,P2,然后用
Public Function 半透明复制图2(ByVal 目标DC As Long, ByVal x目标 As Long, ByVal y目标 As Long, ByVal w目标 As Long, ByVal h目标 As Long, ByVal 源DC As Long, ByVal x源 As Long, ByVal y源 As Long, ByVal w源 As Long, ByVal h源 As Long, ByVal 透明度百分比 As Long) As Long
  Dim lngBlend As Long
  'lngBlend = Val("&h" & Hex(透明度) & "00" & "00")
  lngBlend = RGB(0, 0, 255 - 2.55 * 透明度百分比)
  AlphaBlending 目标DC, x目标, y目标, w目标, h目标, 源DC, x源, y源, w源, h源, lngBlend
End Function

P2 半透明复制到P1显示就可以了, Picture1 是显示用,Picture2隐藏

#4


研究了一下,搞定了。
把图片保存下来,修改后缀为ZIP即可解压看到工程文件。
跪求GDI+在VB6.0环境下 画扇形的函数及使用方法

#5


引用 1 楼 yfvb2010 的回复:
不需要GDI+,是直接用GDI,画扇形,其实,就是API,画圆形,加参数,就能画扇形,半透明,用其它方法可以实现

我奉劝这位仁兄凡是涉及到带alpha通道的半透明图形绘制还是早日放弃GDI,改用GDI+吧……

#6


me4405801 楼上的乃高人啊,测试完毕,基本是我想要的啊,非常感谢。保持联系啊!

#7


再次感谢楼上的,我仔细阅读了你的程序,你的扇形声明函数

Public Declare Function GdipDrawPieI Lib "gdiplus" (ByVal Graphics As Long, ByVal pen As Long, ByVal x As Long, ByVal y As Long, ByVal Width As Long, ByVal Height As Long, ByVal startAngle As Single, ByVal sweepAngle As Single) As GpStatus
我的自己瞎拼凑的扇形声明函数

'Public Declare Function GdipDrawPie Lib "gdiplus" (ByVal Graphics As Long, ByVal pen As Long, ByVal x As Single, ByVal y As Single, ByVal Width As Single, ByVal Height As Single, ByVal X3 As Long, ByVal Y3 As Long) As GpStatus

问题出在形参名称和类型都对不上。


为了避免我这种瞎猫碰死耗子的瞎折腾。
敢问兄台, 能不能发给我一份详细的VB6.0下的GDI+ 各种函数声明清单呢,最好附上具体的使用方法,像datasheet一样,那将感激不尽啊!

#8


引用 7 楼 u011568473 的回复:
再次感谢楼上的,我仔细阅读了你的程序,你的扇形声明函数

Public Declare Function GdipDrawPieI Lib "gdiplus" (ByVal Graphics As Long, ByVal pen As Long, ByVal x As Long, ByVal y As Long, ByVal Width As Long, ByVal Height As Long, ByVal startAngle As Single, ByVal sweepAngle As Single) As GpStatus
我的自己瞎拼凑的扇形声明函数

'Public Declare Function GdipDrawPie Lib "gdiplus" (ByVal Graphics As Long, ByVal pen As Long, ByVal x As Single, ByVal y As Single, ByVal Width As Single, ByVal Height As Single, ByVal X3 As Long, ByVal Y3 As Long) As GpStatus

问题出在形参名称和类型都对不上。


为了避免我这种瞎猫碰死耗子的瞎折腾。
敢问兄台, 能不能发给我一份详细的VB6.0下的GDI+ 各种函数声明清单呢,最好附上具体的使用方法,像datasheet一样,那将感激不尽啊!


你让我说你什么好……
在你的最初的帖子中(http://bbs.csdn.net/topics/390534623),7楼的Veron_04已经给出GDI+相关的详细资料了,你就不能稍微动动脑筋自己思考研究一下么 跪求GDI+在VB6.0环境下 画扇形的函数及使用方法!包括我在此帖中扇形的画法也是参考了他的资料。
如果让我给你GDI+的学习资料,那么我的回答和Veron_04是一样的!

#9


引用 5 楼 me4405801 的回复:
Quote: 引用 1 楼 yfvb2010 的回复:

不需要GDI+,是直接用GDI,画扇形,其实,就是API,画圆形,加参数,就能画扇形,半透明,用其它方法可以实现

我奉劝这位仁兄凡是涉及到带alpha通道的半透明图形绘制还是早日放弃GDI,改用GDI+吧……


这位仁兄,你不知道GDI+,慢的要命啊,我I7+GT660显卡,用GDI+ 画软件介面,要化1秒或者以上,
后来,只能混合GDI,加上缓冲,让软件运行来流畅。如果要做游戏的话,那就是个悲剧。
而GDI非常快。

#10


引用 9 楼 yfvb2010 的回复:
Quote: 引用 5 楼 me4405801 的回复:

Quote: 引用 1 楼 yfvb2010 的回复:

不需要GDI+,是直接用GDI,画扇形,其实,就是API,画圆形,加参数,就能画扇形,半透明,用其它方法可以实现

我奉劝这位仁兄凡是涉及到带alpha通道的半透明图形绘制还是早日放弃GDI,改用GDI+吧……


这位仁兄,你不知道GDI+,慢的要命啊,我I7+GT660显卡,用GDI+ 画软件介面,要化1秒或者以上,
后来,只能混合GDI,加上缓冲,让软件运行来流畅。如果要做游戏的话,那就是个悲剧。
而GDI非常快。


做游戏的话就用更高级的direct或者OPENGL,一般的用户UI可以用GDI+

#11


引用 7 楼 u011568473 的回复:
再次感谢楼上的,我仔细阅读了你的程序,你的扇形声明函数

Public Declare Function GdipDrawPieI Lib "gdiplus" (ByVal Graphics As Long, ByVal pen As Long, ByVal x As Long, ByVal y As Long, ByVal Width As Long, ByVal Height As Long, ByVal startAngle As Single, ByVal sweepAngle As Single) As GpStatus
我的自己瞎拼凑的扇形声明函数

'Public Declare Function GdipDrawPie Lib "gdiplus" (ByVal Graphics As Long, ByVal pen As Long, ByVal x As Single, ByVal y As Single, ByVal Width As Single, ByVal Height As Single, ByVal X3 As Long, ByVal Y3 As Long) As GpStatus

问题出在形参名称和类型都对不上。


为了避免我这种瞎猫碰死耗子的瞎折腾。
敢问兄台, 能不能发给我一份详细的VB6.0下的GDI+ 各种函数声明清单呢,最好附上具体的使用方法,像datasheet一样,那将感激不尽啊!

这个里面的文件“GDIPlus API.bas”就是你要的东东:
VBtray系统托盘图标动态绘制VB源码
http://download.csdn.net/detail/zhao4zhong1/570264

#1


不需要GDI+,是直接用GDI,画扇形,其实,就是API,画圆形,加参数,就能画扇形,半透明,用其它方法可以实现

#2


Public Sub 画圆(hDc As Long, ByVal 圆心X As Long, ByVal 圆心Y As Long, ByVal 宽度 As Long, ByVal 高度 As Long, _
           ByVal 度起点 As Long, ByVal 度终点 As Long, ByVal 框线粗细 As Long, ByVal 线条类型 As 线条类型_m, ByVal 边框色 As Long, ByVal 填充色 As Long)
Dim pBrush As Long, pPen As Long
Dim X1 As Long, X2 As Long, X3 As Long, x4 As Long
Dim Y1 As Long, Y2 As Long, Y3 As Long, y4 As Long
Dim A As Single

X1 = 圆心X - 宽度 / 2
X2 = 圆心X + 宽度 / 2

Y1 = 圆心Y - 高度 / 2
Y2 = 圆心Y + 高度 / 2

A = 3.14159265 / 180  '为了将角度转换为弧度
X3 = 圆心X + (宽度 * Sin(度起点 * A))
Y3 = 圆心Y - (高度 * Cos(度起点 * A))

x4 = 圆心X + (宽度 * Sin(度终点 * A))
y4 = 圆心Y - (高度 * Cos(度终点 * A))

pBrush = SelectObject(hDc, CreateSolidBrush(填充色))
pPen = SelectObject(hDc, CreatePen(线条类型, 框线粗细, 边框色))

If 填充色 < 0 Then
Call Arc(hDc, X1, Y1, X2, Y2, X3, Y3, x4, y4)
Else
Call Pie(hDc, X1, Y1, X2, Y2, X3, Y3, x4, y4)
End If
Call DeleteObject(SelectObject(hDc, pBrush))
Call DeleteObject(SelectObject(hDc, pPen))
End Sub

#3


半透明,可以先将扇形画到,P2,然后用
Public Function 半透明复制图2(ByVal 目标DC As Long, ByVal x目标 As Long, ByVal y目标 As Long, ByVal w目标 As Long, ByVal h目标 As Long, ByVal 源DC As Long, ByVal x源 As Long, ByVal y源 As Long, ByVal w源 As Long, ByVal h源 As Long, ByVal 透明度百分比 As Long) As Long
  Dim lngBlend As Long
  'lngBlend = Val("&h" & Hex(透明度) & "00" & "00")
  lngBlend = RGB(0, 0, 255 - 2.55 * 透明度百分比)
  AlphaBlending 目标DC, x目标, y目标, w目标, h目标, 源DC, x源, y源, w源, h源, lngBlend
End Function

P2 半透明复制到P1显示就可以了, Picture1 是显示用,Picture2隐藏

#4


研究了一下,搞定了。
把图片保存下来,修改后缀为ZIP即可解压看到工程文件。
跪求GDI+在VB6.0环境下 画扇形的函数及使用方法

#5


引用 1 楼 yfvb2010 的回复:
不需要GDI+,是直接用GDI,画扇形,其实,就是API,画圆形,加参数,就能画扇形,半透明,用其它方法可以实现

我奉劝这位仁兄凡是涉及到带alpha通道的半透明图形绘制还是早日放弃GDI,改用GDI+吧……

#6


me4405801 楼上的乃高人啊,测试完毕,基本是我想要的啊,非常感谢。保持联系啊!

#7


再次感谢楼上的,我仔细阅读了你的程序,你的扇形声明函数

Public Declare Function GdipDrawPieI Lib "gdiplus" (ByVal Graphics As Long, ByVal pen As Long, ByVal x As Long, ByVal y As Long, ByVal Width As Long, ByVal Height As Long, ByVal startAngle As Single, ByVal sweepAngle As Single) As GpStatus
我的自己瞎拼凑的扇形声明函数

'Public Declare Function GdipDrawPie Lib "gdiplus" (ByVal Graphics As Long, ByVal pen As Long, ByVal x As Single, ByVal y As Single, ByVal Width As Single, ByVal Height As Single, ByVal X3 As Long, ByVal Y3 As Long) As GpStatus

问题出在形参名称和类型都对不上。


为了避免我这种瞎猫碰死耗子的瞎折腾。
敢问兄台, 能不能发给我一份详细的VB6.0下的GDI+ 各种函数声明清单呢,最好附上具体的使用方法,像datasheet一样,那将感激不尽啊!

#8


引用 7 楼 u011568473 的回复:
再次感谢楼上的,我仔细阅读了你的程序,你的扇形声明函数

Public Declare Function GdipDrawPieI Lib "gdiplus" (ByVal Graphics As Long, ByVal pen As Long, ByVal x As Long, ByVal y As Long, ByVal Width As Long, ByVal Height As Long, ByVal startAngle As Single, ByVal sweepAngle As Single) As GpStatus
我的自己瞎拼凑的扇形声明函数

'Public Declare Function GdipDrawPie Lib "gdiplus" (ByVal Graphics As Long, ByVal pen As Long, ByVal x As Single, ByVal y As Single, ByVal Width As Single, ByVal Height As Single, ByVal X3 As Long, ByVal Y3 As Long) As GpStatus

问题出在形参名称和类型都对不上。


为了避免我这种瞎猫碰死耗子的瞎折腾。
敢问兄台, 能不能发给我一份详细的VB6.0下的GDI+ 各种函数声明清单呢,最好附上具体的使用方法,像datasheet一样,那将感激不尽啊!


你让我说你什么好……
在你的最初的帖子中(http://bbs.csdn.net/topics/390534623),7楼的Veron_04已经给出GDI+相关的详细资料了,你就不能稍微动动脑筋自己思考研究一下么 跪求GDI+在VB6.0环境下 画扇形的函数及使用方法!包括我在此帖中扇形的画法也是参考了他的资料。
如果让我给你GDI+的学习资料,那么我的回答和Veron_04是一样的!

#9


引用 5 楼 me4405801 的回复:
Quote: 引用 1 楼 yfvb2010 的回复:

不需要GDI+,是直接用GDI,画扇形,其实,就是API,画圆形,加参数,就能画扇形,半透明,用其它方法可以实现

我奉劝这位仁兄凡是涉及到带alpha通道的半透明图形绘制还是早日放弃GDI,改用GDI+吧……


这位仁兄,你不知道GDI+,慢的要命啊,我I7+GT660显卡,用GDI+ 画软件介面,要化1秒或者以上,
后来,只能混合GDI,加上缓冲,让软件运行来流畅。如果要做游戏的话,那就是个悲剧。
而GDI非常快。

#10


引用 9 楼 yfvb2010 的回复:
Quote: 引用 5 楼 me4405801 的回复:

Quote: 引用 1 楼 yfvb2010 的回复:

不需要GDI+,是直接用GDI,画扇形,其实,就是API,画圆形,加参数,就能画扇形,半透明,用其它方法可以实现

我奉劝这位仁兄凡是涉及到带alpha通道的半透明图形绘制还是早日放弃GDI,改用GDI+吧……


这位仁兄,你不知道GDI+,慢的要命啊,我I7+GT660显卡,用GDI+ 画软件介面,要化1秒或者以上,
后来,只能混合GDI,加上缓冲,让软件运行来流畅。如果要做游戏的话,那就是个悲剧。
而GDI非常快。


做游戏的话就用更高级的direct或者OPENGL,一般的用户UI可以用GDI+

#11


引用 7 楼 u011568473 的回复:
再次感谢楼上的,我仔细阅读了你的程序,你的扇形声明函数

Public Declare Function GdipDrawPieI Lib "gdiplus" (ByVal Graphics As Long, ByVal pen As Long, ByVal x As Long, ByVal y As Long, ByVal Width As Long, ByVal Height As Long, ByVal startAngle As Single, ByVal sweepAngle As Single) As GpStatus
我的自己瞎拼凑的扇形声明函数

'Public Declare Function GdipDrawPie Lib "gdiplus" (ByVal Graphics As Long, ByVal pen As Long, ByVal x As Single, ByVal y As Single, ByVal Width As Single, ByVal Height As Single, ByVal X3 As Long, ByVal Y3 As Long) As GpStatus

问题出在形参名称和类型都对不上。


为了避免我这种瞎猫碰死耗子的瞎折腾。
敢问兄台, 能不能发给我一份详细的VB6.0下的GDI+ 各种函数声明清单呢,最好附上具体的使用方法,像datasheet一样,那将感激不尽啊!

这个里面的文件“GDIPlus API.bas”就是你要的东东:
VBtray系统托盘图标动态绘制VB源码
http://download.csdn.net/detail/zhao4zhong1/570264