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的问题呢?
不知道原因,希望哪位能够帮忙解答一下,谢谢!!
工程文件也以打包在附件,希望可以解答,非常感谢!!

解决方案 »

  1.   

    Option Explicit
    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
      

  2.   

    图片框的AutoRedraw 一定设为True
      

  3.   

    还不行的话,看一下Timer控件的Interval属性设置了没有
    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
      

  4.   

    哈哈哈~~~
    终于搞定了,将第二个图设为不可见,非常感谢SYSSZ!
      

  5.   

    再想问一下SYSSC,我的程序是不是因为球的半径设的太小了才看不见的还是因为别的??
    看了程序都差不多,我那个怎么就看不到?
      

  6.   

    你的程序有几处问题:(1)Private Sub Form_Load()过程里没有
    picCanvas.AutoRedraw = True,也许你可以在设计时设置;
    (2)就是你说的,半径太小,只有一个点,我改为BallR = 100;
    (3)tmrBounce_Timer()事件没有
     picCanvas.Cls
    这样看上去不是球,而一串园环