我刚刚尝试在我的一个 VB6 应用程序中设置滚动选取框进度条,虽然它似乎切换到选取框模式,但自动计时器(通过设置PBM_SETMARQUEE
)要么失败,要么被忽略。
- 我有一个适当的视觉风格清单。
- 我已经调用
InitCommonControls
了表单的Initialize
事件。 - 我正在使用 v5 SP2 通用控件。
- 项目已编译。
- 我已经
PBS_MARQUEE
通过设置样式SetWindowLong
并确认它已应用。 PBM_SETMARQUEE
消息返回 1 。
结果:
- 如果我最小化并恢复窗口,它会前进一步。
- 如果我设置
.Value
它会前进一步。 - 如果我发送
PBM_STEPIT
它会前进一步。 - 如果我发送
PBM_SETMARQUEE
它坐在那里什么都不做。
如果我没有传递初始PBM_SETMARQUEE
启用消息,那么最小化/恢复不会导致它继续提示计时器是问题所在。
这与 2006 年在此线程中讨论的问题相同
PBM_SETMARQUEE
有没有人对为什么 VB 包装器丢弃消息或相关的计时器事件以及为什么我需要“手动”进行更深入的了解?
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
这是使其取得进展所必需的。
Private Sub Timer1_Timer()
SendMessage ProgressBar1.hWnd, PBM_STEPIT, 0, ByVal 0&
End Sub