回 帖 发 新 帖 刷新版面

主题:[讨论]非常平滑的字幕滚动 (字幕要求左边滚完再右边出现)

见附件



Option Explicit

Private TextLine  As String  '文字信息
Private Index     As Long    '字符索引

Private Scrolling As Boolean '滚动标志
Private t         As Long    '帧延时

Private RText     As RECT
Private RClip     As RECT
Private RUpdate   As RECT

Private Sub Form_Load()
    TextLine = "VB论坛"
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Scrolling = 0 '!
End Sub

Private Sub cmdScroll_Click()
    '-- 开始滚动
    Scrolling = -1
    Index = 1
    Scroll
End Sub

Private Sub Scroll()

  Dim Char As String
  
    With iScroll
         SetRect RClip, 1, 2, .ScaleWidth, .ScaleHeight
         SetRect RText, .ScaleWidth, 1, .ScaleWidth + .TextWidth(Left$(TextLine, 1)), .ScaleHeight
    End With

   Char = Left$(TextLine, 1)

    With iScroll

        Do
            If (timeGetTime - t >= 30) Then

                t = timeGetTime

                If (RText.Right <= .ScaleWidth) Then

                    Index = Index + 1
                   Char = Mid$(TextLine, Index, 1)
                    SetRect RText, .ScaleWidth, 2, .ScaleWidth + .TextWidth(Mid$(TextLine, Index, 1)), .ScaleHeight
                End If

                DrawText .hdc, Char, 2, RText, &H0

               OffsetRect RText, -1, 0

                ScrollDC .hdc, -1, 0, RClip, RClip, 0, RUpdate
                iScroll.Line (.ScaleWidth, 0)-(.ScaleWidth, .ScaleHeight), .BackColor
            End If

            If (Index > Len(TextLine)) Then Index = 0
            DoEvents
            
        Loop Until Scrolling = 0
    End With
End Sub


回复列表 (共5个回复)

沙发

要达到这种效果,其实只要一个文本框和一个计时器就可以实现,用不着这么复杂

板凳

一个文本框和一个计时器就可以实现 这个 我知道..
可是上述代码怎么不能字幕左边滚完再右边出现呢?

3 楼


Private Sub Form_Load()
 ' Form1.BackColor = RGB(192, 192, 192)
 Label1.ForeColor = RGB(255, 0, 255)           '取消阴影,使两段文字完全相同
 ' Label2.ForeColor = RGB(255, 0, 255)
  Label1.Left = 0       '一段文字放在最左端
  'Label2.Left = -Width       '一段文字放在最左端的外面,与Label1
  End Sub     '相差一个窗体距离
    
  Private Sub Timer1_Timer()
  Label1.Left = Label1.Left - 50           '两段文字同时向左移
  'Label2.Left = Label2.Left - 50
  If Label1.Left <= -Width Then           '当文字在窗体外再走完一个窗体的距离时,
  Label1.Left = Width       '又进入窗体
  End If
  'If Label2.Left <= -Width Then
  'Label2.Left = Width
  'End If
  End Sub

4 楼

[quote]要达到这种效果,其实只要一个文本框和一个计时器就可以实现,用不着这么复杂[/quote]


一个文本框和一个计时器就可以实现 这个 我知道..

Private Sub Form_Load()
 ' Form1.BackColor = RGB(192, 192, 192)
 Label1.ForeColor = RGB(255, 0, 255)           '取消阴影,使两段文字完全相同
 ' Label2.ForeColor = RGB(255, 0, 255)
  Label1.Left = 0       '一段文字放在最左端
  'Label2.Left = -Width       '一段文字放在最左端的外面,与Label1
  End Sub     '相差一个窗体距离
    
  Private Sub Timer1_Timer()
  Label1.Left = Label1.Left - 50           '两段文字同时向左移
  'Label2.Left = Label2.Left - 50
  If Label1.Left <= -Width Then           '当文字在窗体外再走完一个窗体的距离时,
  Label1.Left = Width       '又进入窗体
  End If
  'If Label2.Left <= -Width Then
  'Label2.Left = Width
  'End If
  End Sub







可是附件代码怎么不能字幕左边滚完再右边出现呢?

5 楼

今天抽出时间帮你看了一下,要达到你的要求,改动如下:

Private Type RECT
  Left   As Long
  Top    As Long
  Right  As Long
  Bottom As Long
End Type
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
Private Declare Function SetRect Lib "user32" (lpRect As RECT, ByVal x1 As Long, ByVal y1 As Long, ByVal x2 As Long, ByVal y2 As Long) As Long
Private Declare Function OffsetRect Lib "user32" (lpRect As RECT, ByVal x As Long, ByVal y As Long) As Long
Private Declare Function ScrollDC Lib "user32" (ByVal hdc As Long, ByVal dx As Long, ByVal dy As Long, lprcScroll As RECT, lprcClip As RECT, ByVal hrgnUpdate As Long, lprcUpdate As RECT) As Long
Private Declare Function DrawText Lib "user32" Alias "DrawTextA" (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long

Private Scrolling As Boolean '滚动标志

Private Sub Form_Unload(Cancel As Integer)
Scrolling = 0
End Sub

Private Sub cmdScroll_Click()  '-- 开始滚动
Dim TextLine  As String  '文字信息
Dim t         As Long    '帧延时
Dim RText As RECT, RClip As RECT, RUpdate As RECT
Scrolling = Not Scrolling
TextLine = "VB论坛"
With iScroll
  SetRect RClip, 0, 2, .ScaleWidth, .ScaleHeight
  SetRect RText, .ScaleWidth, 2, .ScaleWidth + .TextWidth(TextLine), .ScaleHeight
  Do
    If (timeGetTime - t >= 30) Then
      t = timeGetTime
      If (RText.Right < 0) Then
        SetRect RText, .ScaleWidth, 2, .ScaleWidth + .TextWidth(TextLine), .ScaleHeight
      End If
      DrawText .hdc, TextLine, -1, RText, &H0
      OffsetRect RText, -1, 0
      ScrollDC .hdc, -1, 0, RClip, RClip, 0, RUpdate
      iScroll.Line (.ScaleWidth, 0)-(.ScaleWidth, .ScaleHeight), .BackColor
    End If
    DoEvents
  Loop Until Scrolling = 0
End With
End Sub

我来回复

您尚未登录,请登录后再回复。点此登录或注册