Marquee progress bar and PM_SETMARQUEE being ignored in VB6

601 views Asked by At

I've just tried setting up a scrolling marquee progress bar in one of my VB6 applications, and while it seems to switch into marquee mode, the automatic timer (set via PBM_SETMARQUEE) either fails or is ignored.

  • I have an appropriate visual style manifest.
  • I have called InitCommonControls in the form's Initialize event.
  • I am using the v5 SP2 common controls.
  • The project is compiled.
  • I have set the PBS_MARQUEE style via SetWindowLong and confirmed it has applied.
  • The PBM_SETMARQUEE message returns 1.

The results:

  • If I minimise and restore the window it progresses one step.
  • If I set .Value it progresses one step.
  • If I send PBM_STEPIT it progresses one step.
  • If I send PBM_SETMARQUEE it sits there doing nothing.

If I don't pass the initial PBM_SETMARQUEE enable message, then the minimise/restore doesn't cause it to progress suggesting the timer is the problem.

This is the same issue discussed in this thread from 2006

Does anyone have any deeper insight as to why the VB wrapper is dropping the PBM_SETMARQUEE message or the associated timer events and why I need to do it "manually"?

Option Explicit

Private Const GWL_STYLE = (-16)
Private Const PBS_MARQUEE = &H8
Private Const WM_USER = &H400
Private Const PBM_STEPIT = WM_USER + 5
Private Const PBM_SETMARQUEE = WM_USER + 10

Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Private Sub Form_Load()
  'Set the marquee style
  Dim Style As Long
  Style = GetWindowLong(ProgressBar1.hWnd, GWL_STYLE)
  Style = Style Or PBS_MARQUEE
  SetWindowLong ProgressBar1.hWnd, GWL_STYLE, Style
  'Set automatic marquee mode
  SendMessage ProgressBar1.hWnd, PBM_SETMARQUEE, 1, ByVal 0&
End Sub

This is needed to make it progress.

Private Sub Timer1_Timer()
  SendMessage ProgressBar1.hWnd, PBM_STEPIT, 0, ByVal 0&
End Sub
0

There are 0 answers