裏画面は2個作れない?

[戻る]
アロエ 2009/12/15(火) 15:26:47
VS2008のMFCでシングルドキュメントインターフェイスの画像を縮小表示するプログラム
を作っています。

普通に画像を表示するということはできるようになったのですが画像を縮小して表示しよ
うとするとうまくいきません。

かなり省略しますがこんな感じのコードです


mDC1.CreateCompatibleDC(GetDC())
mDC2.CreateCompatibleDC(GetDC())
    ↓
mDC1.SelectObject(画像が読み込まれたCBitmap)
    ↓
mDC2.StreachBlt(mDC1)
    ↓
OnDraw(&mDC2)
OnDrawには表画面にBitBltするコードが書かれています。


これでプログラムを実行すると画像が表示されずウィンドウの下地が表示されるように
なってしまいます。

誰かこうすればいいって思う方いたら教えてください。

aetos 2009/12/15(火) 15:36:04
これでは OnDraw で mDC2 に描画していて、表画面には何も描いていないように思われ
ます。

Kelly 2009/12/15(火) 15:37:04
mDC2にビットマップが選択されていないからではないですか?

縮小されたサイズで互換ビットマップ(CBitmap::CreateCompatibleBitmap)
を作成し、mDC2に選択してやる必要があると思います。

ryo 2009/12/15(火) 16:16:18
「2個つくれない」なんてことはない。
これ以上掘り下げるには、省略しすぎで、アドヴァイスしようがない

bun 2009/12/15(火) 18:10:50
OnDraw()はCView派生クラスのものですか?
だとしたら、自分で作ったデバイスコンテキストを渡すべきではない。
というより、自らOnDraw()を呼ぶべきではない。

あくまで、WM_PAINTメッセージの結果として、
  OnPaint() → OnDraw()
と呼ばれた結果のOnDraw()の引数であるpDCにBitBlt()する。

そうしないと、いくら自らOnDraw()を呼んで描画しても、
WM_PAINTメッセージで上書きされてしまう。

結論として、以下のようにしましょう。
----------------------------------------
画像を縮小して表示するイベントが発生
  ↓
mDC2.StreachBlt(mDC1);
までは今まで通り
  ↓
Invalidate()またはInvalidateRect()を呼んで
WM_PAINTを発生させる
  ↓
OnDraw()内で mDC2 から pDC にBitBlt()
----------------------------------------

アロエ 2009/12/15(火) 19:16:51
[[解決]]
>>aetosさん
表画面への描画はOnDraw()メソッドで行っています。

>>ryoさん
もうちょっと詳しく書いたほうが良かったでしょうか。
すいません(>_<)

>>bunさん
そういうものなんですか、参考になります。

>>Kellyさん
CreateCompatibleBitmapで作ったCBitmapをmDC2に
選択させましたらちゃんと表画面にも表示が反映されるようになりました。
適切なアドバイスありがとうございました。

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