お邪魔します。
題名の通り、メモリ上のビットマップデータを拡大、縮小をStretchBltを用いて施し、
それを一時保存しようとしています。
ここでソースを書くのはかなり見づらくなるので、プロジェクトごとアップしました。
(画像読み込みには、ルーチェ's Homepage管理人様、ルーチェさんの作成されたimgct.dllを使用しています)
問題となっているのは、Graph.cppの関数DrawRoteです。
自分はビットマップデータをメインビットマップと
マスクビットマップに分けて管理しています。
一連の流れですが、
1.メインビットマップデータを拡大し、StretchBltでtempBmpBfに保存
2.CreatMaskBmpによって、マスクビットマップデータ作成
です。現段階では、描写すると、四角形が赤で塗りつぶされて表示されます。
恐らく、ビットマップデータをtempBmpBfにコピーする段階で
うまく行われていないのですが、自分の知識では、解決できないでいます。。
裏描写用のデバイスコンテキストhdcから
CreateCompatibleDC
CreateCompatibleBitmap
SelectObject
の順で一時保存用のビットマップとそのデバイスコンテキストを生成しているのですが・・・
この段階で既に問題があるのか・・・
説明が足りない部分があるのなら、聞いてください。。
よろしくお願いします。
Ne_60622.zip
http://www1.axfc.net/uploader/Ne/so/60622
DLキー:kazuoni
#補足
なぜ、一時保存しているのかというと、拡大したものを
回転する関数でもあるので、一時拡大したものを保存しておき、
そこから、保存したものを、回転して描写したいというものによります。
メモリ上のビットマップデータの拡大・縮小コピー
Re:メモリ上のビットマップデータの拡大・縮小コピー
あんまり深く読みといていないので意図した通りになるかわかりませんが、
こんな感じでしょうか。
[color=#d0d0ff" face="monospace]
HDC tempMaskBf=0;
HDC tempBmpBf=CreateCompatibleDC(hdc);
HBITMAP tempMaskBmp=0;
HBITMAP tempBmpBmp=CreateCompatibleBitmap(hdc,(int)(this->xSize*ExtX),(int)(this->ySize*ExtY));
HBITMAP tempMaskPrevBmp=0;
HBITMAP tempBmpPrevBmp=(HBITMAP)SelectObject(tempBmpBf,tempBmpBmp);
if( !StretchBlt( tempBmpBf, 0, 0, (int)(this->xSize*ExtX),(int)(this->ySize*ExtY),// 描画先
GetBitmap(), cellNum%this->xNum*this->xSize, cellNum/this->xNum*this->ySize,this->xSize, this->ySize, // 描画元
SRCCOPY )
||
!CreatMaskBmp(hdc,this->colorKey,tempBmpBf,&tempMaskBf,&tempMaskBmp,&tempMaskPrevBmp,(int)(this->xSize*ExtX),(int)(this->ySize*ExtY) )
)
[/color]
こんな感じでしょうか。
[color=#d0d0ff" face="monospace]
HDC tempMaskBf=0;
HDC tempBmpBf=CreateCompatibleDC(hdc);
HBITMAP tempMaskBmp=0;
HBITMAP tempBmpBmp=CreateCompatibleBitmap(hdc,(int)(this->xSize*ExtX),(int)(this->ySize*ExtY));
HBITMAP tempMaskPrevBmp=0;
HBITMAP tempBmpPrevBmp=(HBITMAP)SelectObject(tempBmpBf,tempBmpBmp);
if( !StretchBlt( tempBmpBf, 0, 0, (int)(this->xSize*ExtX),(int)(this->ySize*ExtY),// 描画先
GetBitmap(), cellNum%this->xNum*this->xSize, cellNum/this->xNum*this->ySize,this->xSize, this->ySize, // 描画元
SRCCOPY )
||
!CreatMaskBmp(hdc,this->colorKey,tempBmpBf,&tempMaskBf,&tempMaskBmp,&tempMaskPrevBmp,(int)(this->xSize*ExtX),(int)(this->ySize*ExtY) )
)
[/color]
Re:メモリ上のビットマップデータの拡大・縮小コピー
Justyさん、ご回答ありがとうございます!
またもズバっと正解でした。。
ラスタオペレーションコード・・・
もろ間違えてますね。。転送先とandしても、まったくの無意味でした。。
CreateCompatibleBitmapの第一引数が
「互換性を取るデバイスコンテキストのハンドル」
ってのは、msdnをみて、分かっていましたが、
互換性っという意味もわからず、つながりのあるハンドル= tempBmpBf
と決め打ちしていました。
(よくみたら、msdnでも下にサンプルが載っていました。。)
ソースを見て、回答していただき、手間をとらせてしまい、
大変申し訳ありませんでした。
とても助かりました。
次回もよろしくお願いします。
またもズバっと正解でした。。
ラスタオペレーションコード・・・
もろ間違えてますね。。転送先とandしても、まったくの無意味でした。。
CreateCompatibleBitmapの第一引数が
「互換性を取るデバイスコンテキストのハンドル」
ってのは、msdnをみて、分かっていましたが、
互換性っという意味もわからず、つながりのあるハンドル= tempBmpBf
と決め打ちしていました。
(よくみたら、msdnでも下にサンプルが載っていました。。)
ソースを見て、回答していただき、手間をとらせてしまい、
大変申し訳ありませんでした。
とても助かりました。
次回もよろしくお願いします。