0

我刚刚尝试在我的一个 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
4

0 回答 0