API (Application Program Interface) VB6 | |
画像のコピー V |
スプライト画像の移動
せっかく背景を透過して表示させることができたので、移動させてみる。UFOをウィンドウの左から右方向へ移動させる。一度移動すると終わりである。
タイマー1つ(Timer1)を追加する。Timer1のIntervalプロパティを200に設定する。
・プログラムリスト
Option Explicit Dim UFOX As Long, UFOY As Long '←追加 Private Sub UFOidou() '←変更(Form_Click→UFOidou) Dimx As Long, y As Long,w As Long, h As Long Dim dmy As Longx = 10 'コピー先の座標y = 10w = Picture2.Width 'コピー元のサイズ h = Picture2.Height 'Form1とマスク画像(picture3)をORで合成 dmy = BitBlt(Form1.hdc, UFOX, UFOY, w, h, Picture3.hdc, 0, 0, SRCPAINT) 'Form1と元画像(picture2)をANDで合成 dmy = BitBlt(Form1.hdc, UFOX, UFOY, w, h, Picture2.hdc, 0, 0, SRCAND) Form1.Refresh End Sub Private Sub Form_Load() Dim dmy As Long Form1.Show 'Picture1のサイズをフォームに合わせる。 Picture1.Width = Form1.ScaleWidth Picture1.Height = Form1.ScaleHeight 'Formの画像を退避 dmy = BitBlt(Picture1.hdc, 0, 0, Form1.ScaleWidth, Form1.ScaleHeight, _ Form1.hdc, 0, 0, SRCCOPY) 'UFO座標初期化 UFOX = 10 '←追加 UFOY = 10 '←追加 End Sub Private Sub Timer1_Timer() '←プロシージャ追加 Dim dmy As Long 'Formの画像を初期化 dmy = BitBlt(Form1.hdc, 0, 0, Form1.ScaleWidth, Form1.ScaleHeight, _ Picture1.hdc, 0, 0, SRCCOPY) UFOX = UFOX + 10 'UFOのx座標加算(移動) UFOidou End Sub
実行するとスプライト処理された画像が移動する。
API関数とメソッドの速度差
ちなみに、BitBlt関数でUFOIdouサブプロシージャをプログラムした今回の例とPaintPictureメソッドでプログラムした例「§4 画像の利用」との速度差を調べてみる。
結果は次のようになった。 (PV 733MHz)
API関数(UFOIdouを10000回繰り返す。) … 約0.4秒
メソッド(UFOIdouを100回繰り返す。) … 約8.1秒
タイマー(Timer1)のEnableプロパティをFalseに設定して動作を止める。
コマンドボタン(Command1)を1つ配置する。
プログラムは次の通りである。
Private Sub Command1_Click()
Dim s As Double, a As Double, n As Integer
s = Timer
For n = 1 To 100 '#1
UFOIdou
Next n
a = Timer - s
Print a
End Sub
#1 API版はFor n=1 To 10000として10000回繰り返す。メソッド版はFor n= 1 To 100として100回繰り返す。メソッド版の繰り返しを余り大きくすると終了までに時間がかかるので注意が必要である。100回で8秒と言うことは、単純に1000回で80秒(1分20秒)、10000回で800秒(13分20秒)となる。
画像のコピー V | |
Copyright © 2002 Hiroshi Masuda |