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_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