Blog~2016-08-16IDirectDrawSurface7::BltDirectXDirectX編・・・。MicrosoftDirectXは、Microsoftが開発したマルチメディアAPI・・・。ゲーム開発における、グラフィック、サウンド、入出力の実装などに役立っている・・・。最新はDirectX12だが、ここではとってもレガシーなDirectX7から扱っていく・・・少しだけ・・・。DirectX7にはDirectDrawというとってもレガシーな2D処理API群があったので、それを使って画像を表示してみる・・・。CenterDXSDK_Jun10.exeである・・・。CenterDXSDK_Feb10.exeなので、こっちをダウンロードしてインストール・・・。インストール中にエラーが出ることがある・・・。SDKインストール時に”S1023エラー”が出る時の対処法こんなのが出たので、再配布パッケージを削除してから再インストールするなど・・・。インストールしたら、[ツール]-[オプション]から、インクルードパスが通ってるか確認・・・。ライブラリパスも・・・。上に追加されてるとおもうので下に寄せとく・・・。(他のライブラリとのビルド順調整のつもり・・・。)Win32の空のプロジェクトを作成したら、ddraw.libとdxguid.libをリンク・・・。test.bmpを置く・・・。IDirectDrawSurface7.cppを追加して、コードを書いてく・・・。ddraw.hをインクルード・・・。DirectXはCOMベースのライブラリなので、ポインタを指定するとReleaseメソッドが呼ばれてポインタをNULLにするようなマクロSAFE_RELEASEを用意しておくのが慣習・・・。高速描画を実現するため、PeekMessageによるメインループ構造にする・・・。メッセージが来ていない時に、DirectXによる描画処理を行う・・・。(ゲーム開発ではよく使われている慣習・・・。)まずはiPhaseが0の時(一回しか実行されない)は、DirectXによる描画の準備を行う・・・。DirectDrawCreateExでDirectDrawオブジェクトを生成する・・・。戻り値はHRESULT型なので、FAILEDマクロで判定して、失敗ならbreakして終了処理に向かう・・・。lpDDの型はLPDIRECTDRAW7となっているが、DirectDrawCreateでLPDIRECTDRAWなポインタを指定するなどしても作成はできる・・・。LPDIRECTDRAW7とは違うものなので、より新しいの"7"の付いてるほうにしたほうがいいだろう・・・。lpDD->SetCooperativeLevelで協調レベル設定・・・。協調レベルこういうものらしい・・・。今回は普通のウィンドウアプリなのでDDSCL_NORMALを指定・・・。クリッパーは表示できる範囲を指定するもので、オブジェクトポインタがlpClipに入ったら、lpClip->SetHWndでウィンドウハンドルを指定する・・・。続いて、ウィンドウに表示される画面、プライマリーサーフェイスを作る・・・。プライマリサーフェイスディスクリプタで設定する・・・。DDSCAPS_PRIMARYSURFACEでプライマリーサーフェイスであることを指定・・・。DDSURFACEDESC2を使っているが、DDSURFACEDESCと間違えないように・・・。ddsdを使って、lpDD->CreateSurfaceでプライマリーサーフェイスlpDDSPrimaryを作る・・・。lpDDSPrimary->SetClipperでlpClipを指定・・・。続いて、表示する画像test.bmpを貼り付けたサーフェイスを作成する・・・。test.bmpをロードする・・・。メモリデバイスコンテキストhMemDCを作成・・・。SelectObjectでhMemDCとhBitmapを紐づけ・・・。画像の幅と高さを知りたいので、GetObjectでBITMAPオブジェクトbitmap取得・・・。サーフェイスディスクリプタを設定・・・。システムメモリでオフスクリーン(表示されない)なサーフェイスで、ビットマップの幅と高さに合わせたものとして作成・・・。lpDD->CreateSurfaceでサーフェイス作成・・・。lpDDSBitmap->GetDCで、このサーフェイスのデバイスコンテキストを取得・・・。BitBltでメモリデバイスコンテキストから、ビットマップサーフェイスのデバイスコンテキストにビット転送・・・。これでビットマップサーフェイスに画像が映る・・・。lpDDSBitmap->ReleaseDCでビットマップサーフェイスのデバイスコンテキストを解放・・・。hDDSBitmapDCはもうNULLにしちゃう・・・。(これをやっても、プライマリーサーフェイスに描画した時、画像は消えていない・・・。)iPhaseを1にする・・・。これでここはもう通らない・・・。次にここに来る・・・。ここでサーフェイスを描画する・・・。GetWindowRectでウィンドウ矩形を取得し、ウィンドウタイトルとか境界線とかの分を調整したら、lpDDSPrimary->BltでlpDDSPrimaryの上にlpDDSBitmapを描画する・・・。(Windows)でこれを繰り返してる・・・。作成した順とは逆にSAFE_RELEASEなどで削除・解放をしていく・・・。これで実行すると、test.bmpが表示される・・・。子ウィンドウを作成し、追加する・・・。(27)はてなブログをはじめよう!BG1さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。