DirectDraw

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
Sunshine

DirectDraw

#1 投稿記事 by Sunshine »

 DirectDrawにおいて、あるデバイスコンテキストの内容を2Dテクスチャにコピーしたいのですが、方法が分かりません。
 恐らく、テクスチャのサーフェイスを取得してIDirect3DSurface9::GetDC関数でデバイスコンテキストを取得し、そこにBitBltでコピーする、と思うのですが、肝心のサーフェイスの取得方法がわかりません。
 どうすればできるのでしょうか。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#2 投稿記事 by イグトランス »

dx_GetDevice関数を使うとIDirect3DDevice9へのポインタが得られます。
IDirect3DDevice9にはサーフェイスを作るメソッドがあります。

DirectXはロクにやったことがないので細かいことはわかりませんがこれでどうでしょうか?
Sunshine

#3 投稿記事 by Sunshine »

 イグトランスさん、ありがとうございます。
 とりあえず、CImage2Dクラスに以下の関数を追加してみました。

コード: 全て選択

	Function PasteDC(nXDest As Long, nYDest As Long, nWidth As Long, nHeight As Long, hdcSrc As HDC, nXSrc As Long, nYSrc As Long, dwRop As DWord) As Long
		Dim lpD3DSurface As LPDIRECT3DSURFACE9
		Dim hdcDest As HDC
		'サーフェイスの取得
		lpD3DTexture->GetSurfaceLevel(0, VarPtr(lpD3DSurface))
		'デバイスコンテキストの取得
		lpD3DSurface->GetDC(VarPtr(hdcDest))

		'描画
		PasteDC = BitBlt(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, dwRop)

		'開放
		lpD3DSurface->ReleaseDC(hdcDest)
		lpD3DSurface->Release()
	End Function
 しかし、これではこの関数を呼び出す前に、CImage2D::SetTexture関数を呼び出さないと、当然アクセス違反になってしまいます。わざわざSetTexture関数を呼ばなくてもいいような、もうちょっと使い勝手がいい関数にしたいのですが、どのように手直ししたらいいでしょうか。テクスチャの作り方さっぱりです…
 あとメモリリークを起こしていないか心配だ…(^^;
返信する