VB6にて作成しています.
現在,Form2とForm3の各picture1.picture にpsetにて描画しています.
(ちなみに大きさは横320縦240ピクセルです)
それをForm5のpicture1.pictureに交互に表示したいと思っています.
切替えの時間間隔は,timeGetTime関数で制御したい.
文章がわかりにくいと思いますが,回答頂けたら幸いです.
APIのBitBltを使えば高速でコピーが可能。
Form5にPictureBoxをふたつ用意して、Form2のものとForm3のものをコピーしておき、交互に表示、非表示を切り替えるのが一番速いかと思いますが、仕様が可能なら参考にしてください
返信ありがとうございます.
私の発信が遅くなりました.すみません.
①(”通ってみた”)下の内容でやってみましたが,単体(Form2やForm3)それぞれの切替は,できますが,Do文で切替えると表示されず,最後の画像だけが表示されてしまいます.
>Form5にPictureBoxをふたつ用意して、Form2のものとForm3のものをコピーしておき、交互に表示、非表示を切り替えるのが一番速いかと思いますが、仕様が可能なら参考にしてください
②我龍院さんのAPIのBitBltを使えば高速でコピーが可能。
初心者なので,内容がわからず現在ヘルプで見てます.
ちなみに,コードは以下の通りしました.
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
Option Explicitは入れたほうが良いんだけど・・・
とりあえず
timer0 = timer1 を If m = 0 Then の外に出す。
Loopの前に DoEventsを入れる。
# 以下、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つの画像を高速に入れ替えるという処理はできているの?
# それができたら、自前で描画完了した画像に置き換えるだけじゃ?
”我龍院”さん、”ま”さん 助言ありがとうございます.
我龍院さんの
①timer0 = timer1 を If m = 0 Then の外に出す。
は,切替てからの時間経過を知るため,ifの外だと具合が悪いのですが・・・
②Loopの前に DoEventsを入れる。
は,入れたらギクシャクですが,切替るようになりました.
スムーズではありません.
(切替えるデータが320*240なのですが,再表示が遅いのですかね?)
私のプログラムでは,Do文1サイクル当り約50ミリ秒で処理されますので,入れ替わっていると思いますが,画面表示が2Hzでもパラパラと部分的な表示のみでスムーズに表示されません.
一度,”ま”さんの内容で確認してみます.
”我龍院”さんスミマセンでした.
timer0 = timer1 を If m = 0 Then の外に出す。
とDoEventの未挿入が原因でした.
若干パラつきますが,高速切替できました.
ちなみに p = 1000 / (Text2.Text / 2)
も間違いで, p = 1000 / Text2.Text / 2
でした.
みなさまの助言に感謝します.
またわからない場合,よろしくお願いします.
ツイート | ![]() |