GDI ではアルファを書き込めないので何を書いても透明(アルファ0)にで塗りつぶされるので使い物にならないかも。要調査
GDI+ を使えばアルファも書き込める
アルファを反映するには以下のコードでモードを変更する必要あり。
Graphics myGraphics(hDC);
myGraphics.SetCompositingMode(Gdiplus::CompositingModeSourceCopy);
前提
GDI を使用して描画する仕組みを知っている
http://www.kumei.ne.jp/c_lang/sdk/sdk_24.htm とか
フルカラーのみ。カラーテーブルは考慮していません。
ビットマップ形式のヘッダ、ピクセル情報の格納先はメモリ上に作成、確保しておく必要があります。ヘッダ情報の後ろにピクセル情報をコピーします。
参考 http://www.kumei.ne.jp/c_lang/sdk2/sdk_169.htm
CImage が超便利
考え方
- デバイスコンテキストを取得
- ビットマップ割り当て
- 描画
- ビットマップ形式でメモリ上にコピー
- メモリ上のデータをテクスチャに割り当て
1 と 2 と 4 について
メモリデバイスコンテキストにビットマップを割り当てる方法
メモリデバイスコンテキストを作成(CreateCompatibleDC)して、ビットマップを割り当てる(CreateCompatibleBitmap)場合
メモリコピーは、GetDIBits でピクセル情報をコピーできるらしい。未確認
GetDIBits は推奨されていないっぽいのでこの方法は使わない方がよさそう
画像を読み込む場合、CImage クラスを使用する方法
CImage クラスで、Load メソッドを使用して読み込んだ場合、ビットマップが割り当て済みのデバイスコンテキストも同時に作成されるので、それを使用して描画すれば読み込んだ画像の上に描画することができる。
メモリコピーは、ピクセル情報は、GetBits メソッドでピクセルの先頭アドレスが取得できるので memcpy で丸ごとコピーできる。
ただし、GetPitch メソッドでマイナスが返ってきた場合、先頭のアドレスでは無く画像の最終行の先頭アドレスを示しているので、本当の先頭アドレスを計算する必要がある。
3 については取得したデバイスコンテキストで描画するだけ
割愛
5 について
コピーしたデータを
D3DXCreateTextureFromFileInMemory または D3DXCreateTextureFromFileInMemoryEx に渡すだけ。