CBitmapからHBITMAPへ

[戻る]
オッペンハイマー 2008/09/09(火) 19:50:00
以下の変数を定義して、画像を関連付けしている状態で、
    CDC        memDC;
    CBitmap bmp;

bmpからHBITMAPを取得する方法は、

HBITMAP hImageBmp = bmp;

で正しいでしょうか?
上記で取得したhImageBmpに対して画像を変更出来なくなって困っています。。。

是非、お願いします。

maru 2008/09/09(火) 21:07:17
> HBITMAP hImageBmp = bmp;
で CBitmap::operator HBITMAP() が呼び出されますので、
> bmpからHBITMAPを取得する方法
しては正しいでしょう。

> 上記で取得したhImageBmpに対して画像を変更出来なくなって困っています。。。
は、CBitmap bmpの方に問題があるのではないでしょうか?

ryo 2008/09/10(水) 00:50:50
どんな条件(開発環境や、CBitmap bmpの生成やら中身など)で
何がやりたくて、
どんなソースを書き
どんな不具合状態になってるか

を書いてみたほうがいいと思います

仲澤@失業者 2008/09/10(水) 10:17:08
> 上記で取得したhImageBmpに対して画像を変更出来なくなって困っています。。。

どの様なコードでやってますでしょうか。
通常は
 1.表示用(コールバックに渡された)HDCのコンパチブルHDCを作成する
 2.コンパチブルHDCに当該のHBITMAPをSelect()する
 3.コンパチブルHDCに対して描画する
 4.コンパチブルHDCを表示用HDCにBitBlt()等をする
のような手順です。

オッペンハイマー 2008/09/10(水) 10:18:17
maruさんー>お返事ありがとうございます。

HBITMAP hImageBmp = bmp;

で取得した画像をBITMAPファイルにして確認したのですが、
正常に取得できました。

また、
bmpはmemDCにSelectObjectしています。

その後、bmpの画像を加工するため、

SelectObjectしてBitBlt等を行っても駄目なんです。

関連付けが上手くないのでしょうか?

ryoさんー>お返事ありがとうございます。

VC8.0でMDIにより動作しています。

不具合内容は、描画データをCBitmapで保持しており、
その画像をCDCでは加工出来るのですが、
CBitmapからは加工できません。

オッペンハイマー 2008/09/10(水) 10:41:33
[[解決]]
仲澤@失業者さんありがとうございます。
解決しました!

通常は、以下の動作かと思いますが。

 1.表示用(コールバックに渡された)HDCのコンパチブルHDCを作成する
 2.コンパチブルHDCに当該のHBITMAPをSelect()する
 3.コンパチブルHDCに対して描画する
 4.コンパチブルHDCを表示用HDCにBitBlt()等をする
 5.コンパチブルHDCに元HBITMAPをSelect()する

4と5の間で、

2で指定しているHBITMAPを1で作成したコンパチブルDCとは違う、
他のコンパチブルDCにSelectしたかったのです。

そのためには、4と5の間で

・コンパチブルHDCを一度元HBITMAPにSelect
・HBITMAPにてBitBlt
・再度、コンパチブルHDCに当該のHBITMAPをSelect()する

と言った形で行うことが出来ました。

ありがとうございます。

仲澤@失業者 2008/09/10(水) 10:42:03
そ〜すると、CBitmapのメンバーのHBITMAPが、別のHDCに
Select()されている可能性がありますね。ハンドルのコピーも
同様です。
HBITMAPは複数のHDCに、同時にSelect()することはできません。
素直にCreateBitmap()したハンドルをSelect()したHDCに
CBitmapをBitBltしてから、使用するしかないかもしれません。

仲澤@失業者 2008/09/10(水) 10:43:27
が〜ん 遅かった

オッペンハイマー 2008/09/10(水) 13:24:38
仲澤@失業者さん、ありがとうございます。


>>HBITMAPは複数のHDCに、同時にSelect()することはできません。

そのようですね↑
すっかり見落としていました。

何が原因なのか推測出来なかった分、
わかりづらい質問になりましたが、
明確な内容のお返事ありがとうございます。

古いスレッドには追加発言できません。