02.画像表示

画像がないと始まらないのだ!

まず画像を読み込まないと始まらんのです!お話にならない。ちゃんちゃらおかしいねハッハッハー!(謎
画像を読み込む、それにはDirectDraw7.CreateSurfaceFromFileを使うのだあ!後はヘルプ参照。以上!
・・・・じゃダメですかね、やっぱり。

Dim ddsd2 As DDSURFACEDESC2
ddsd2.ddscaps.lCaps = DDSCAPS_OFFSCREENPLAIN
Set ddsBuf1 = dd7.CreateSurfaceFromFile("image1.bmp", ddsd2)

面倒だから細かい解説は省略!なるもんはなる!"image1.bmp"を適当に改変して好きな画像を取り込むのだあっ!
ちなみにファイルがない場合は普通に実行時エラーが出ますぞ!

忘れていたが画面更新が必要だ!

本当は前回やっておかなければならなかったはずなのだがウィンドウに気をとられて忘れていましたのだ!
多分DirectXを使う前はピクチャボックスとBitBltまたはPaintPictureを使って頑張ってたと思います。
思い出すのだ!そのときの苦しみRefreshとかVisibleがFalseのピクチャボックスを!
多分そのころの貴方は、AutoRedrawがTrueになっている見えないPictureBoxにBitBltでいろいろ書き込みまくって、全部書き終えてからRefreshして画面に表示していたことでしょう。してなかったらすんまへん。
DirectDrawでそのRefreshに対応するのがFlipなのです!(というのは実は嘘だ。でも似ている気がする)
何を隠そう、前回のフルスクリーンモードで作っていた .ddscaps.lCaps = DDSCAPS_PRIMARYSURFACE Or DDSCAPS_FLIP Or DDSCAPS_COMPLEX なプライマリサーフェスはフリッピングサーフェスといってうんぬんかんぬん・・・・要するにFlipはフルスクリーン専用なのだ。
なにはともあれこんなコードを書いてみた。

ddsPrimary.Flip Nothing, DDFLIP_WAIT

なんだかしらけちゃいますね。ではウィンドウモードだとどうなんでしょ?
こっちの場合はBitBlt(というよりはStretchBlt)に相当するBltを使うのです。

With r0
    .Left = 0:      .Top = 0
    .Right = 640:   .Bottom = 480
End With
ddsPrimary.Blt r0, ddsBack, r0, DDBLT_WAIT

消せ!まず消せ!

ハッキシいって消す作業は必須ではないのダ!しかし、念のため消してから使うのがいいのダ!絵の具が混ざって変な色になっちゃったら泣くに泣けないのダ!!!
背景黒でケシケシしたいばわいは次のようにするのダ!

With r0
    .Left = 0:      .Top = 0
    .Right = 640:   .Bottom = 480
End With
ddsBack.BltColorFill r0, vbBlack

いよいよ画像表示!

さあ、はやる気持ちを抑えて・・・・わしのほうが抑えきれんのジャ!!

ddsBuf1.GetSurfaceDesc ddsd
With r1
    .Left = 0:              .Top = 0
    .Right = ddsd.lWidth:   .Bottom = ddsd.lHeight
End With
With r0
    .Left = X:                  .Top = Y
    .Right = X + ddsd.lWidth:   .Bottom = Y + ddsd.lHeight
End With
ddsBack.Blt r0, ddsBuf1, r1, DDBLT_WAIT

最初の一文で画像の大きさを得ている。他は説明不要じゃロウ。好きなようにXやYを変えて楽しむが良い。

サンプル(2.61kilobyte)

あえて蛇足

さっきからさりげなくddsBackにばっかり画像を映していることにお気づきでせうか。画面に実際に表示されているのはddsPrimaryであることは既に知ってゐるかもしれません。だったらなぜddsBackなぞに映してからFlipやらBltやらをするのでせう。ddsPrimaryに直接描けばさぞかし楽だらうと思ひませんか。
でも・・・・あれとかこれとかはみでちゃう。

失敗例サンプル(2.64kilobyte)