Here you go.  I updated my code quickly to work under PB 4.0.  Read that original link from dontmailme for info on it.
I'll update it in a little bit to be more user friendly but for now you can test this and see what you think  
Code: Select all
; Notes
; -   Coded by Xombie 11/18/2005
Enumeration
   #WindowMain 
EndEnumeration
Enumeration
   #ImageScroll
EndEnumeration
#ScrollWidth = 400
;- Global Variables
Global Dim ArrayScroll.s(3)
Global HandleImage.l
Global HandleTimer.l
Global PositionText.l
Global DoBounce.b
Global BounceDirection.b
Global PauseScroll.b
Global ScrollClick.POINT
Global IsFinishedDrawing.b
;- Procedures
Procedure.l ScrollCallback(HandleWindow.l, message.l, EventID.l, dwTime.l)
   ;
   lImage.l
   ;
   lBrush.l
   ;
   IsMouseOver.b
   ;
   LastPosition.l
   ;
   HoldPosition.POINT
   ;
   BrushProperties.LOGBRUSH
   ; Brush properties - color, brush type.
   HoldRect.RECT
   ; Rectangular coordinates used to fill shapes.
   HyperRect.RECT
   ;
   FontSize.l
   ;
   CellFont.l
   ;
   CellText.s
   ;
   If IsFinishedDrawing
      ;
      GetCursorPos_(@HoldPosition)
      ;
      lHold = WindowFromPoint_(HoldPosition\X, HoldPosition\Y)
      ;
      MapWindowPoints_(0, GadgetID(#ImageScroll), @HoldPosition, 1)
      ;
      If lHold = GadgetID(#ImageScroll) : IsMouseOver = #True : EndIf
      ;
      If PauseScroll : ProcedureReturn : EndIf
      ;
      IsFinishedDrawing = #False
      ;
      lImage = StartDrawing(ImageOutput(HandleImage))
      ;
      BrushProperties\lbStyle = #BS_SOLID
      BrushProperties\lbColor = RGB(0, 0, 0)
      ;
      lBrush = CreateBrushIndirect_(BrushProperties)
      ;
      SelectObject_(lImage, lBrush)
      ;
      HoldRect\left = 0 : HoldRect\top = 0 : HoldRect\right = WindowWidth(#WindowMain) : HoldRect\bottom = 100
      ;
      FillRect_(lImage, HoldRect, lBrush)
      ;
      DeleteObject_(lBrush) : lBrush = 0
      ;
      SetTextColor_(lImage, RGB(255, 0, 0)) : SetBkMode_(lImage, #TRANSPARENT)
      ;
      CellText = ArrayScroll(0)
      ;
      FontSize = -Int((16 * GetDeviceCaps_(lImage, #LOGPIXELSY)) / 72)
      ; Using 28 as the height.
      CellFont = CreateFont_(FontSize,0,0,0,0,0,0,0,#ANSI_CHARSET,#OUT_DEFAULT_PRECIS,#CLIP_DEFAULT_PRECIS,#PROOF_QUALITY,0,"Arial")
      ; Set any font formatting here.  Italics, bold, whatever.
      SelectObject_(lImage, CellFont)
      ;
      DrawText_(lImage, @CellText, Len(CellText), @HoldRect, #DT_NOCLIP | #DT_NOPREFIX | #DT_SINGLELINE | #DT_CALCRECT) 
      ;
      MoveToEx_(lImage, PositionText, Int((GadgetHeight(#ImageScroll) - HoldRect\bottom) / 2), 0)
      ;
      DrawText_(lImage, @CellText, Len(CellText), @HoldRect, #DT_NOCLIP | #DT_NOPREFIX | #DT_SINGLELINE)
      ; Draw the column header. 
      DeleteObject_(CellFont)
      ;
      LastPosition = PositionText + HoldRect\right
      ;
      SetRect_(@HoldRect, 0, 0, 0, 0)
      ;
      ;- Begin Hyperlink Drawing
      If IsMouseOver And ArrayScroll(0) <> ""
         ;
         SetTextColor_(lImage, RGB(0, 0, 255)) : SetBkMode_(lImage, #TRANSPARENT)
         ;
         CellText = ArrayScroll(1)
         ;
         CellFont = CreateFont_(FontSize,0,0,0,0,1,1,0,#ANSI_CHARSET,#OUT_DEFAULT_PRECIS,#CLIP_DEFAULT_PRECIS,#PROOF_QUALITY,0,"Arial")
         ; Set any font formatting here.  Italics, bold, whatever.
         SelectObject_(lImage, CellFont)
         ;
         DrawText_(lImage, @CellText, Len(CellText), @HyperRect, #DT_NOCLIP | #DT_NOPREFIX | #DT_SINGLELINE | #DT_CALCRECT) 
         ;
         If (HoldPosition\X > LastPosition And HoldPosition\X < LastPosition + HyperRect\right)
            ;
            MoveToEx_(lImage, LastPosition, Int((GadgetHeight(#ImageScroll) - HyperRect\bottom) / 2), 0)
            ;
            DrawText_(lImage, @CellText, Len(CellText), @HyperRect, #DT_NOCLIP | #DT_NOPREFIX | #DT_SINGLELINE)
            ; Draw the column header.
            If ScrollClick\X <> -1 And ScrollClick\Y <> -1 : RunProgram(ArrayScroll(3)) : EndIf
            ;
         Else
            ;
            IsMouseOver = #False
            ;
         EndIf
         ;
         DeleteObject_(CellFont)
         ;
      EndIf
      ;
      If IsMouseOver = #False Or ArrayScroll(0) = ""
         ;
         SetTextColor_(lImage, RGB(255, 0, 0)) : SetBkMode_(lImage, #TRANSPARENT)
         ;
         CellText = ArrayScroll(1)
         ;
         CellFont = CreateFont_(FontSize,0,0,0,0,0,1,0,#ANSI_CHARSET,#OUT_DEFAULT_PRECIS,#CLIP_DEFAULT_PRECIS,#PROOF_QUALITY,0,"Arial")
         ; Set any font formatting here.  Italics, bold, whatever.
         SelectObject_(lImage, CellFont)
         ;
         DrawText_(lImage, @CellText, Len(CellText), @HyperRect, #DT_NOCLIP | #DT_NOPREFIX | #DT_SINGLELINE | #DT_CALCRECT) 
         ;
         MoveToEx_(lImage, LastPosition, Int((GadgetHeight(#ImageScroll) - HyperRect\bottom) / 2), 0)
         ;
         DrawText_(lImage, @CellText, Len(CellText), @HyperRect, #DT_NOCLIP | #DT_NOPREFIX | #DT_SINGLELINE)
         ; Draw the column header. 
         DeleteObject_(CellFont)
         ;
      EndIf
      ;
      LastPosition + HyperRect\right
      ;-
      If ArrayScroll(2) <> ""
         ;
         SetTextColor_(lImage, RGB(255, 0, 0)) : SetBkMode_(lImage, #TRANSPARENT)
         ;
         CellText = ArrayScroll(2)
         ;
         CellFont = CreateFont_(FontSize,0,0,0,0,0,0,0,#ANSI_CHARSET,#OUT_DEFAULT_PRECIS,#CLIP_DEFAULT_PRECIS,#PROOF_QUALITY,0,"Arial")
         ; Set any font formatting here.  Italics, bold, whatever.
         SelectObject_(lImage, CellFont)
         ;
         DrawText_(lImage, @CellText, Len(CellText), @HoldRect, #DT_NOCLIP | #DT_NOPREFIX | #DT_SINGLELINE | #DT_CALCRECT) 
         ;
         MoveToEx_(lImage, LastPosition, Int((GadgetHeight(#ImageScroll) - HoldRect\bottom) / 2), 0)
         ;
         DrawText_(lImage, @CellText, Len(CellText), @HoldRect, #DT_NOCLIP | #DT_NOPREFIX | #DT_SINGLELINE)
         ; Draw the column header. 
         DeleteObject_(CellFont)
         ;
      EndIf
      ;
      LastPosition + HoldRect\right
      ;
      StopDrawing()
      ;
      SetGadgetState(#ImageScroll, ImageID(HandleImage))
      ;
      If DoBounce
         ; Bouncing between boundaries.
         If BounceDirection
            ; Scrolling left.
            If LastPosition = 0 : PositionText + 1 : BounceDirection = 0 : Else : PositionText -1 : EndIf
            ;
         Else
            ; Scrolling light.
            If LastPosition >= GadgetWidth(#ImageScroll) : PositionText - 1 : BounceDirection = 1 : Else : PositionText + 1 : EndIf
            ;
         EndIf
         ;
      Else
         ; Wrapping.
         If LastPosition >= 0 : PositionText - 1 : Else : PositionText = GadgetWidth(#ImageScroll) : EndIf
         ; Move the text to the left for the next call.
      EndIf
      ;
      ScrollClick\X = -1 : ScrollClick\Y = -1
      ;
      IsFinishedDrawing = #True
      ;
   EndIf
   ;
EndProcedure
;- Main Code
;
EventID.l
; Variable to hold the window message.
DoQuit.b
; Variable to control whether we quit the window or not.  Automatically set to #False.
lHold.l
;
HoldString.s
;
ArrayScroll(0) = "From Xombie! - Go to "
ArrayScroll(1) = "here"
ArrayScroll(2) = " and be happy!"
ArrayScroll(3) = "http://www.seijin.net/"
;
If OpenWindow(#WindowMain, 0, 0, 650, 310, "Test", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_SizeGadget)
   ; Create the main window.
   If CreateGadgetList(WindowID(#WindowMain))
      ;
      HandleImage = CreateImage(#PB_Any, #ScrollWidth - 1, 40)
      ;
      ImageGadget(#ImageScroll, 0, 0, #ScrollWidth - 1, 100, ImageID(HandleImage), #PB_Image_Border)
      ;
   EndIf
   ;
   IsFinishedDrawing = #True
   ;
   PositionText = GadgetWidth(#ImageScroll)
   ;
   HandleTimer = SetTimer_(0, 0, 1, @ScrollCallback())
   ;
   Repeat
      ;
      ;{ Event Loop
      EventID = WaitWindowEvent()
      ;
      If EventID = #PB_Event_CloseWindow
         ; Close the program.
         DoQuit = #True
         ;
      ElseIf EventID = #PB_Event_SizeWindow
         ;
         ;
      ElseIf EventID = #PB_Event_Menu
         ; Menu Events
         ;
      ElseIf EventID = #PB_Event_Gadget
         ; Control Events
         If EventGadget() = #ImageScroll
            ;
            If EventType() = #PB_EventType_LeftClick
               ;
               GetCursorPos_(@ScrollClick) : MapWindowPoints_(0, GadgetID(#ImageScroll), @ScrollClick, 1)
               ;
               ; If PauseScroll : PauseScroll = #False : Else : PauseScroll = #True : EndIf 
               ;
            ElseIf EventType() = #PB_EventType_RightClick
               ;
               Hold01.s = InputRequester("Scroll Test", "Please enter the first part of the message.  This will either be the whole message or the message before the hyperlink.  If using a hyperlink, please leave a space after this string.", "")
               ;
               Hold02.s = InputRequester("Scroll Test", "Please enter the web address.  Leave blank if no web address is needed.", "http://www.seijin.net/")
               ;
               Hold03.s = InputRequester("Scroll Test", "Please enter the text that follows the web address.  Leave blank if no web address was used.  If using a hyperlink, please use a space at the beginning of this string.", "")
               ;
               ArrayScroll(0) = Hold01 : ArrayScroll(1) = Hold02 : ArrayScroll(2) = Hold03
               ;
               ; If DoBounce : DoBounce = #False : Else : DoBounce = #True : BounceDirection = #True : EndIf
               ;
            EndIf
            ;
         EndIf
         ;
      EndIf
      ;}
      ;
   Until DoQuit = #True
   ;
   KillTimer_(0, HandleTimer)
   ;
EndIf
;