0

VB6 アプリケーションの 1 つでスクロール マーキー プログレス バーを設定しようとしましたが、マーキー モードに切り替わったように見えますが、自動タイマー ( で設定PBM_SETMARQUEE) が失敗するか無視されます。

  • 適切なビジュアル スタイル マニフェストがあります。
  • InitCommonControlsフォームのInitializeイベントで呼び出しました。
  • v5 SP2 共通コントロールを使用しています。
  • プロジェクトがコンパイルされます。
  • PBS_MARQUEE経由でスタイルを設定し、SetWindowLong適用されていることを確認しました。
  • PBM_SETMARQUEEメッセージは 1 を返します。

結果:

  • ウィンドウを最小化して元に戻すと、ウィンドウは 1 ステップ進みます。
  • 私が設定した場合.Value、それは1ステップ進みます。
  • 送ればPBM_STEPIT一歩進みます。
  • 私が送信した場合PBM_SETMARQUEE、何もせずにそこに座っています。

最初の有効化メッセージを渡さないとPBM_SETMARQUEE、最小化/復元によって進行せず、タイマーに問題があることが示唆されます。

これは、 2006 年のこのスレッドで議論されたのと同じ問題です。

PBM_SETMARQUEEVBラッパーがメッセージまたは関連するタイマーイベントをドロップする理由と、「手動で」行う必要がある理由について、誰かがより深い洞察を持っていますか?

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