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
InitCommonControlsin the form'sInitializeevent. - I am using the v5 SP2 common controls.
- The project is compiled.
- I have set the
PBS_MARQUEEstyle viaSetWindowLongand confirmed it has applied. - The
PBM_SETMARQUEEmessage returns 1.
The results:
- If I minimise and restore the window it progresses one step.
- If I set
.Valueit progresses one step. - If I send
PBM_STEPITit progresses one step. - If I send
PBM_SETMARQUEEit 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