2つのpictureの内容を別のpictureボックスで高速に切替したい.

解決


gonta  2007-06-21 20:48:40  No: 99045

VB6にて作成しています.

現在,Form2とForm3の各picture1.picture にpsetにて描画しています.
(ちなみに大きさは横320縦240ピクセルです)
それをForm5のpicture1.pictureに交互に表示したいと思っています.
切替えの時間間隔は,timeGetTime関数で制御したい.

文章がわかりにくいと思いますが,回答頂けたら幸いです.


我龍院  2007-06-22 18:01:04  No: 99046

APIのBitBltを使えば高速でコピーが可能。


通ってみた  2007-06-22 23:32:08  No: 99047

Form5にPictureBoxをふたつ用意して、Form2のものとForm3のものをコピーしておき、交互に表示、非表示を切り替えるのが一番速いかと思いますが、仕様が可能なら参考にしてください


gonta  2007-06-25 23:14:53  No: 99048

返信ありがとうございます.
私の発信が遅くなりました.すみません.

①(”通ってみた”)下の内容でやってみましたが,単体(Form2やForm3)それぞれの切替は,できますが,Do文で切替えると表示されず,最後の画像だけが表示されてしまいます.

>Form5にPictureBoxをふたつ用意して、Form2のものとForm3のものをコピーしておき、交互に表示、非表示を切り替えるのが一番速いかと思いますが、仕様が可能なら参考にしてください

②我龍院さんのAPIのBitBltを使えば高速でコピーが可能。
初心者なので,内容がわからず現在ヘルプで見てます.


gonta  2007-06-25 23:23:14  No: 99049

ちなみに,コードは以下の通りしました.

Form5.Show
timer0 = timeGetTime()
timer1 = timer0
jikanstart = timer0
jikanend = timer0 + Text3.Text * 1000
' text3.textは,表示時間を秒にて入力
m = 0
' mは,Form2とForm3の画面切替番号
p = 1000 / (Text2.Text / 2)
' text2.textは,1秒当たりの周期を入力
Do Until timer1 > jikanend
    timer1 = timeGetTime()
        
    If timer1 - timer0 >= p Then
        If m = 0 Then
            timer0 = timer1
            m = 1
        Else
            m = 0
        End If
          
        Select Case m
            Case 1
                Set Form5.Picture1.Picture = Form3.Picture1.Image
            Case Else
                Set Form5.Picture1.Picture = Form2.Picture1.Image
        End Select
            
    End If
Loop


我龍院  2007-06-26 01:04:24  No: 99050

Option Explicitは入れたほうが良いんだけど・・・

とりあえず

timer0 = timer1  を  If m = 0 Then  の外に出す。

Loopの前に  DoEventsを入れる。


  2007-06-26 01:31:33  No: 99051

# 以下、100 * 100 程度の大きさの画像を2枚用意する。
# コントロール配列化した PictureX() 2つのピクチャボックス
# に各画像を設定しておく。
# Text1 テキストBOXと Command1 ボタンを画面フォームに配置
# して実行すると、PictureX(0) と PictureX(1) が一定間隔で
# 交互に表示されます。

Private countX As Integer

Private Sub Command1_Click()
    Timer1.Enabled = False
    
    MsgBox Text1.Text & " にへんこう"
    On Error GoTo ErrorTrap
    Timer1.Interval = CInt(Text1.Text)
    
ErrorTrap:
    Timer1.Enabled = True

End Sub

Private Sub Form_Load()

    ''-- タイマ停止
    Timer1.Enabled = False

    ''-- 表示(0) 、非表示(1) に設定
    PictureX(0).Visible = True
    PictureX(1).Visible = False
    
    countX = 0
    
    ''-- 2つのピクチャを同じ大きさ同じ位置に設定
    PictureX(1).Left = PictureX(0).Left
    PictureX(1).Top = PictureX(0).Top
    PictureX(1).Width = PictureX(0).Width
    PictureX(1).Height = PictureX(0).Height
    
    ''-- タイマ起動
    Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
    Dim bShow As Boolean
    Dim pos As Integer
    
    ''-- 表示面と描画面が交互に切り替わる
    ''-- countX=0 の時、PictureX(0) が true の反対で false に、非表示
    pos = CInt(countX Mod 2)
    bShow = PictureX(pos).Visible
    PictureX(pos).Visible = Not bShow
    countX = countX + 1
    ''-- countX=1 の時、PictureX(1) が true に、つまり表示
    pos = CInt(countX Mod 2)
    PictureX(pos).Visible = bShow
    
    ''-- 次回は、PictureX(0) が Not false で true に
    ''-- PictureX(1) が false で非表示に・・・・を延々繰り返す。
End Sub

# 2つの画像を高速に入れ替えるという処理はできているの?
# それができたら、自前で描画完了した画像に置き換えるだけじゃ?


gonta  2007-06-26 10:54:01  No: 99052

”我龍院”さん、”ま”さん  助言ありがとうございます.
我龍院さんの
①timer0 = timer1  を  If m = 0 Then  の外に出す。
は,切替てからの時間経過を知るため,ifの外だと具合が悪いのですが・・・

②Loopの前に  DoEventsを入れる。
は,入れたらギクシャクですが,切替るようになりました.
スムーズではありません.
(切替えるデータが320*240なのですが,再表示が遅いのですかね?)

私のプログラムでは,Do文1サイクル当り約50ミリ秒で処理されますので,入れ替わっていると思いますが,画面表示が2Hzでもパラパラと部分的な表示のみでスムーズに表示されません.

一度,”ま”さんの内容で確認してみます.


gonta  2007-06-26 11:10:41  No: 99053

”我龍院”さんスミマセンでした.
timer0 = timer1  を  If m = 0 Then  の外に出す。
とDoEventの未挿入が原因でした.
若干パラつきますが,高速切替できました.

ちなみに      p = 1000 / (Text2.Text / 2)
も間違いで,  p = 1000 / Text2.Text / 2
でした.

みなさまの助言に感謝します.
またわからない場合,よろしくお願いします.


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加