由于VBA拿掉了专门画图的函数,所以需要调用系统画图API
'下面代码复制到模块
Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Declare Function Arc Lib "gdi32" (ByVal hdc As Long, _
ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, _
ByVal X3 As Long, ByVal Y3 As Long, ByVal X4 As Long, ByVal Y4 As Long) As Long
Declare Function MoveToEx Lib "gdi32" (ByVal hdc As Long, _
ByVal x As Long, ByVal y As Long, lpPoint As POINTAPI) As Long
Declare Function LineTo Lib "gdi32" (ByVal hdc As Long, _
ByVal x As Long, ByVal y As Long) As Long
Declare Function CancelDC Lib "gdi32" (ByVal hdc As Long) As Long
Declare Function CreatePen Lib "gdi32" (ByVal nPenStyle As Long, _
ByVal nWidth As Long, ByVal crColor As Long) As Long
Const PS_DASH = 1
Const PS_DASHDOT = 3
Const PS_DASHDOTDOT = 4
Const PS_DOT = 2
Const PS_NULL = 5
Const PS_SOLID = 0
Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Type POINTAPI
x As Long
y As Long
End Type
'Arc参数 类型及说明
' hdc Long,一个显示场景的句柄
' X1,Y1 Long,指定围绕椭圆的一个矩形的左上角位置
' X2,Y2 Long,指定围绕椭圆的一个矩形的右下角位置
' X3,Y3 Long,指定圆弧起点
' X4,Y4 Long,指定圆弧终点
'下面代码复制到窗体
Private Sub Form_Load()
Dim pt As POINTAPI
Dim hPen As Long
Dim hPenPrev As Long
hPen = CreatePen(PS_DOT, 1, vbRed)
Me.AutoRedraw = True
hPenPrev = SelectObject(Me.hdc, hPen)
MoveToEx Me.hdc, 10, 100, pt
LineTo Me.hdc, 200, 100
SelectObject Me.hdc, hPenPrev
DeleteObject hPen
End Sub
Private Sub CommandButton1_Click()
Dim hwnd As Long
Dim hdc As Long
Dim pt As POINTAPI
Dim p0(0 To 1) '圆0圆心坐标
Dim p1(0 To 1) '圆1圆心坐标
Dim p3(0 To 1) '切线切点0坐标
Dim p4(0 To 1) '切线切点1坐标
Dim p5(0 To 7) '圆0坐标
Dim p6(0 To 7) '圆1坐标
Dim d0 '圆0直径
Dim d1 '圆1直径
Dim s0 As Double '圆心距离
Dim dx, dy, dr
Dim sin1 As Double '切点半径斜角正弦值
Dim cos1 As Double '切点半径斜角余弦值
p0(0) = 100: p0(1) = 200
p1(0) = 200: p1(1) = 200
d0 = 50
d1 = 80
dx = p1(0) - p0(0)
dy = p1(1) - p0(1)
dr = (d1 - d0) / 2
s0 = Sqr(dx ^ 2 + dy ^ 2)
cos1 = dx * dr / s0 ^ 2 - dy * Sqr(1 - (dr / s0) ^ 2) / s0
sin1 = Sqr(1 - (cos1) ^ 2)
p3(0) = p0(0) - d0 / 2 * cos1
p3(1) = p0(1) - d0 / 2 * sin1
p4(0) = p1(0) - d1 / 2 * cos1
p4(1) = p1(1) - d1 / 2 * sin1
p5(0) = p0(0) - d0 / 2
p5(1) = p0(1) - d0 / 2
p5(2) = p0(0) + d0 / 2
p5(3) = p0(1) + d0 / 2
p5(4) = p0(0) - d0 / 2
p5(5) = p0(1) - d0 / 2
p5(6) = p0(0) - d0 / 2
p5(7) = p0(1) - d0 / 2
p6(0) = p1(0) - d1 / 2
p6(1) = p1(1) - d1 / 2
p6(2) = p1(0) + d1 / 2
p6(3) = p1(1) + d1 / 2
p6(4) = p1(0) - d1 / 2
p6(5) = p1(1) - d1 / 2
p6(6) = p1(0) - d1 / 2
p6(7) = p1(1) - d1 / 2
hwnd = FindWindow(vbNullString, "UserForm1") '获得窗口句柄
If hwnd = 0 Then
Else
hdc = GetDC(hwnd)
Arc hdc, p5(0), p5(1), p5(2), p5(3), p5(4), p5(5), p5(6), p5(7)
Arc hdc, p6(0), p6(1), p6(2), p6(3), p6(4), p6(5), p6(6), p6(7)
MoveToEx hdc, p3(0), p3(1), pt
LineTo hdc, p4(0), p4(1)
CancelDC hdc
End If
End Sub
版权声明:本文为qq2427637322原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。