原来你是想做个这么东西别用InvalidateRectBynum
先将屏幕内容保存到另一个位图
擦除时直接BitBit

解决方案 »

  1.   

    而且最好不要直接在屏幕上画先将屏幕内容保存到另一个位图
    将自己的窗体覆盖桌面
    将屏幕图像BitBlt到自己的窗口
      

  2.   

    zyl我还是说的更清楚些吧.
    我就是要在鼠标周围画个圈(反正随便什么,线也可以,图也可以)
    他可以在屏幕上显示而不是某一个窗体..
    并可以随鼠标平滑移动..
      

  3.   

    我不知道.做一次bitblt传输整个屏幕需要花多少时间..
    会不会很慢呢?
      

  4.   

    '在Form上按下鼠标并拖动Option ExplicitPrivate Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
    Private Declare Function Ellipse Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
    Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
    Private 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 Type POINTAPI
            x As Long
            y As Long
    End TypePrivate DesktopDC As Long
    Private PT As POINTAPIPrivate Sub Form_Load()
        Me.AutoRedraw = True
    End SubPrivate Sub Form_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
        If Button = 1 Then
            Me.Cls
            Call GetCursorPos(PT)
            DesktopDC = GetDC(0)
        End If
    End SubPrivate Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
        If Button = 1 Then
            Call BitBlt(DesktopDC, PT.x - 10, PT.y - 10, 20, 20, Me.hdc, 0, 0, vbSrcCopy)
            Call GetCursorPos(PT)
            Call BitBlt(Me.hdc, 0, 0, 20, 20, DesktopDC, PT.x - 10, PT.y - 10, vbSrcCopy)
            Call Ellipse(DesktopDC, PT.x - 10, PT.y - 10, PT.x + 10, PT.y + 10)
        End If
    End SubPrivate Sub Form_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
        If Button = 1 Then
            Call BitBlt(DesktopDC, PT.x - 10, PT.y - 10, 20, 20, Me.hdc, 0, 0, vbSrcCopy)
            Call ReleaseDC(0, DesktopDC)
        End If
    End Sub
      

  5.   

    各位..
    我是要在屏幕上画东西.而不是我的窗体.
    我也不是要做透明窗体.
    我用bitblt 保存,在恢复,,还是不行啊.
    如果有窗体重新遮盖的话.就出问题了.
      

  6.   

    呵呵.
    我实在是没有办法了.
    用bitblt实现效果不是很好..因为要保存,在恢复,重画的不理想,保存的时候正好有刷新,或遮盖那么就会把这个保存下来.在恢复的时候就不对了.因该junwhj所给的,是保存一块20*20的区域所以问题还不是很明显.如果是200*200的,那就很容易出现问题了.上面的程序如果你鼠标点标题栏或点机器其他程序的时候就会出现问题.
    我找到了个取巧的办法,那就是用透明窗体来做..因为windows负责了重画,所以效果还不错...