Option Explicit
Private Const MERGEPAINT = &HBB0226
Private Const SRCAND = &H8800C6
Private Const SRCCOPY = &HCC0020
Private Const BallR = 10
Private Const BallD = 2 * BallR + 1Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As LongPrivate CurX As Single
Private CurY As Single
Private OldX As Single
Private OldY As Single
Private VelX As Single
Private VelY As Single
Private Xmax As Single
Private Ymax As SinglePrivate Sub DrawBall() '自定义DrawBall过程
'调用API函数BitBlt BitBlt picCanvas.hDC, OldX - BallR, OldY - BallR, BallD, BallD, picHidden.hDC, OldX - BallR, OldY - BallR, SRCCOPY
OldX = CurX
OldY = CurY
picCanvas.Circle (CurX, CurY), BallR '绘制圆
picCanvas.Refresh
End Sub
Private Sub Form_Load() Width = (Width - ScaleWidth) + picCanvas.Width '设置窗体的宽度与高度
Height = (Height - ScaleHeight) + picCanvas.Height
Xmax = picCanvas.ScaleWidth - BallR
Ymax = picCanvas.ScaleHeight - BallR
Randomize '随机函数
CurX = Int((Xmax - BallR + 1) * Rnd + BallR)
CurY = Int((Ymax - BallR + 1) * Rnd + BallR)
OldX = CurX
OldY = CurY
VelX = Int((10 - 5 + 1) * Rnd + 5)
VelY = Int((10 - 5 + 1) * Rnd + 5)
DrawBall
End SubPrivate Sub tmrBounce_Timer()'计时器事件
CurX = CurX + VelX
If (CurX > Xmax) Then
CurX = Xmax
VelX = -VelX
ElseIf (CurX < BallR) Then
CurX = BallR
VelX = -VelX
End If
CurY = CurY + VelY
If (CurY > Ymax) Then
CurY = Ymax
VelY = -VelY
ElseIf (CurY < BallR) Then
CurY = BallR
VelY = -VelY
End If
DrawBall
End Sub以上是照书上的源代码写的,但运行时怎么就没有随机跳动的小球呢?难道是DrawBall过程运行不成功??或者是API函数BitBlt的问题呢?
不知道原因,希望哪位能够帮忙解答一下,谢谢!!
工程文件也以打包在附件,希望可以解答,非常感谢!!
Private Const MERGEPAINT = &HBB0226
Private Const SRCAND = &H8800C6
Private Const SRCCOPY = &HCC0020
Private Const BallR = 10
Private Const BallD = 2 * BallR + 1Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As LongPrivate CurX As Single
Private CurY As Single
Private OldX As Single
Private OldY As Single
Private VelX As Single
Private VelY As Single
Private Xmax As Single
Private Ymax As SinglePrivate Sub DrawBall() '自定义DrawBall过程
'调用API函数BitBlt BitBlt picCanvas.hDC, OldX - BallR, OldY - BallR, BallD, BallD, picHidden.hDC, OldX - BallR, OldY - BallR, SRCCOPY
OldX = CurX
OldY = CurY
picCanvas.Circle (CurX, CurY), BallR '绘制圆
picCanvas.Refresh
End Sub
Private Sub Form_Load() Width = (Width - ScaleWidth) + picCanvas.Width '设置窗体的宽度与高度
Height = (Height - ScaleHeight) + picCanvas.Height
Xmax = picCanvas.ScaleWidth - BallR
Ymax = picCanvas.ScaleHeight - BallR
Randomize '随机函数
CurX = Int((Xmax - BallR + 1) * Rnd + BallR)
CurY = Int((Ymax - BallR + 1) * Rnd + BallR)
OldX = CurX
OldY = CurY
VelX = Int((10 - 5 + 1) * Rnd + 5)
VelY = Int((10 - 5 + 1) * Rnd + 5)
DrawBall
End SubPrivate Sub tmrBounce_Timer()'计时器事件
CurX = CurX + VelX
If (CurX > Xmax) Then
CurX = Xmax
VelX = -VelX
ElseIf (CurX < BallR) Then
CurX = BallR
VelX = -VelX
End If
CurY = CurY + VelY
If (CurY > Ymax) Then
CurY = Ymax
VelY = -VelY
ElseIf (CurY < BallR) Then
CurY = BallR
VelY = -VelY
End If
DrawBall
End Sub以上是照书上的源代码写的,但运行时怎么就没有随机跳动的小球呢?难道是DrawBall过程运行不成功??或者是API函数BitBlt的问题呢?
不知道原因,希望哪位能够帮忙解答一下,谢谢!!
工程文件也以打包在附件,希望可以解答,非常感谢!!
Private Const MERGEPAINT = &HBB0226
Private Const SRCAND = &H8800C6
Private Const SRCCOPY = &HCC0020
Private Const BallR = 100
Private Const BallD = 200 * BallR + 1Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As LongPrivate CurX As Single
Private CurY As Single
Private OldX As Single
Private OldY As Single
Private VelX As Single
Private VelY As Single
Private Xmax As Single
Private Ymax As SinglePrivate Sub DrawBall() '自定义DrawBall过程
'调用API函数BitBlt BitBlt picCanvas.hDC, OldX - BallR, OldY - BallR, BallD, BallD, picHidden.hDC, OldX - BallR, OldY - BallR, SRCCOPY
OldX = CurX
OldY = CurY
picCanvas.Circle (CurX, CurY), BallR '绘制圆
picCanvas.Refresh
End Sub
Private Sub Form_Load()
picCanvas.AutoRedraw = True
Width = (Width - ScaleWidth) + picCanvas.Width '设置窗体的宽度与高度
Height = (Height - ScaleHeight) + picCanvas.Height
Xmax = picCanvas.ScaleWidth - BallR
Ymax = picCanvas.ScaleHeight - BallR
Randomize '随机函数
CurX = Int((Xmax - BallR + 1) * Rnd + BallR)
CurY = Int((Ymax - BallR + 1) * Rnd + BallR)
OldX = CurX
OldY = CurY
VelX = Int((10 - 5 + 1) * Rnd + 5)
VelY = Int((10 - 5 + 1) * Rnd + 5)
DrawBall
End SubPrivate Sub tmrBounce_Timer()
picCanvas.Cls
'计时器事件
CurX = CurX + VelX
If (CurX > Xmax) Then
CurX = Xmax
VelX = -VelX
ElseIf (CurX < BallR) Then
CurX = BallR
VelX = -VelX
End If
CurY = CurY + VelY
If (CurY > Ymax) Then
CurY = Ymax
VelY = -VelY
ElseIf (CurY < BallR) Then
CurY = BallR
VelY = -VelY
End If
DrawBall
End Sub
Private Sub Form_Load()
tmrBounce.Interval = 100 '时间间隔0.1秒
picCanvas.AutoRedraw = True '位图持久输出
Width = (Width - ScaleWidth) + picCanvas.Width '设置窗体的宽度与高度
Height = (Height - ScaleHeight) + picCanvas.Height
Xmax = picCanvas.ScaleWidth - BallR
Ymax = picCanvas.ScaleHeight - BallR
Randomize '随机函数
CurX = Int((Xmax - BallR + 1) * Rnd + BallR)
CurY = Int((Ymax - BallR + 1) * Rnd + BallR)
OldX = CurX
OldY = CurY
VelX = Int((10 - 5 + 1) * Rnd + 5)
VelY = Int((10 - 5 + 1) * Rnd + 5)
DrawBall
End Sub
终于搞定了,将第二个图设为不可见,非常感谢SYSSZ!
看了程序都差不多,我那个怎么就看不到?
picCanvas.AutoRedraw = True,也许你可以在设计时设置;
(2)就是你说的,半径太小,只有一个点,我改为BallR = 100;
(3)tmrBounce_Timer()事件没有
picCanvas.Cls
这样看上去不是球,而一串园环