裏画面は2個作れない? – プログラミング – Home

裏画面は2個作れない?
 
通知
すべてクリア

[解決済] 裏画面は2個作れない?


アロエ
 アロエ
(@アロエ)
ゲスト
結合: 15年前
投稿: 8
Topic starter  

VS2008のMFCでシングルドキュメントインターフェイスの画像を縮小表示するプログラム
を作っています。

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

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

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

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

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


引用未解決
トピックタグ
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

これでは OnDraw で mDC2 に描画していて、表画面には何も描いていないように思われ
ます。


返信引用
Kelly
 Kelly
(@Kelly)
ゲスト
結合: 16年前
投稿: 13
 

mDC2にビットマップが選択されていないからではないですか?

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


返信引用
ryo
 ryo
(@ryo)
ゲスト
結合: 23年前
投稿: 252
 

「2個つくれない」なんてことはない。
これ以上掘り下げるには、省略しすぎで、アドヴァイスしようがない


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

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

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

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

結論として、以下のようにしましょう。
----------------------------------------
画像を縮小して表示するイベントが発生

mDC2.StreachBlt(mDC1);
までは今まで通り

Invalidate()またはInvalidateRect()を呼んで
WM_PAINTを発生させる

OnDraw()内で mDC2 から pDC にBitBlt()
----------------------------------------


返信引用
アロエ
 アロエ
(@アロエ)
ゲスト
結合: 15年前
投稿: 8
Topic starter  

>>aetosさん
表画面への描画はOnDraw()メソッドで行っています。

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

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました