メモリデバイスコンテキスト

[戻る]
トンプソン [E-Mail] 2005/03/01(火) 13:47:38
こんにちわ。
今、VC++の描画を学んでいるところです。
描画は出来たのですが、ちらつきが多く、それを対処しようと
メモリデバイスコンテキスト(今、勉強中ですが・・・)を
使用したいです。
以下のコードはデバイスコンテキストとメモリデバイスコンテキスト
を比較しようとして作りました。
コード内の******で

&Cbmp だとデバイスコンテキスト
pTmpBitmap だとメモリデバイスコンテキスト

としたつもりなんですが。。。
pTmpBitmapの場合ウィンドウに描画されないんです・・・。
なにかヒントになることでもいいので教えていただけませんか?
よろしくお願いします。


//ビットマップ
CBitmap Cbmp ;
Cbmp.LoadBitmap(IDB_TEST);
CDC    TestDc ;
TestDc.CreateCompatibleDC( pDC ) ;

CBitmap *pTmpBitmap;
pTmpBitmap = TestDc.GetCurrentBitmap();

TestDc.SelectObject( ******* ) ;
//TestDc.SelectObject( &Cbmp ) ;//OK
//TestDc.SelectObject( pTmpBitmap ) ;//NG????

pDC -> BitBlt( (nCount)*25+3 , 3 , 70 , 70 , & CamDc , 0 , 0 , SRCPAINT  ) ;
Cbmp.DeleteObject();

トンプソン [E-Mail] 2005/03/01(火) 14:05:33
間違えました。
pDC -> BitBlt( (nCount)*25+3 , 3 , 70 , 70 , ***** , 0 , 0 , SRCPAINT  ) ;
です。

dairygoods 2005/03/01(火) 14:32:37
> //TestDc.SelectObject( &Cbmp ) ;//OK

これは、TestDc に IDB_TEST から読み込んだビットマップ(Cbmp)をセットします。

> //TestDc.SelectObject( pTmpBitmap ) ;//NG????

これは、TestDc に、TestDcを最初に作ったときに設定してあった
ビットマップをセットします。

ちなみに、メモリDCを最初に作ったときに設定してあるビットマップとは、
1x1 の 白黒ビットマップで、ほとんどの場合使い物になりません。

そして、
pDC -> BitBlt( ..., &TestDc, 0 , 0 , SRCPAINT  ) ;
とすると、TestDc にセットされているビットマップの内容を、
画面に転送します。

PATIO 2005/03/01(火) 14:43:41
実画面と同じ描画を裏で行いたい場合は、
普通なら実画面にコンパチブルなビットマップを作成して裏画面で選択すると思います。
裏画面で描画するというのは、この場合で言えば、TestDCに対してGDIを呼び出して
描画しておき、描画が終わったタイミングで裏画面(TestDC)から実画面へ画像を転送する
事で表示させるはずです。
単に裏画面のビットマップを表に転送しても意味がないと思います。
裏画面にビットマップを作成するのは、裏画面で行った描画内容を実画面に転送する時に
裏画面上にビットマップを作成しておかないと画像転送が出来ないからです。
裏画面に実画面にコンパチブルなビットマップを作成すると言うのは、
多分、画板に画用紙をセットするようなイメージでいいと思います。
この場合、裏画面用のDCが画板になり、選択するコンパチブルなビットマップが画用紙に
当たると考えれば良いのではないでしょうか。

なぜ、コンパチブルなビットマップを作るべきなのかは、dairygoodsさんの説明を読めば、
一目瞭然かと思います。

トンプソン [E-Mail] 2005/03/01(火) 14:50:07
dairygoodsさんお返事ありがとうございます。
なんとなく分かってきました。

TestDc.SelectObject( &Cbmp ) ;//OK
pDC -> BitBlt( ..., &TestDc, 0 , 0 , SRCPAINT  ) ;
このセットで描画って事ですよね?

ただ、このコードを何度も処理されるので
画面にちらつきが出てしまうんです・・・・。
そこで、メモリデバイスコンテキストがいいと思ったので。
作っているとこだったんです。。
ちらつき防止策でなにかいい案ないでしょうか・・・?

PATIO 2005/03/01(火) 14:56:13
ちらつきと言うことですが、
MFCのフレームワーク側が行っているEraseBackgroundは無効にしていますか?
これが有効だと自分で背景を塗潰している場合に二回塗潰されてしまうので
ちらつきの原因になります。

あとは、私が書いている内容を読んで考えてみてください。
バックバッファを使った描画を紹介した文書であれば、同じような内容が書かれているは
ずです。

トンプソン [E-Mail] 2005/03/01(火) 15:01:32
PATIOさんお返事ありがとうございます!
>EraseBackground
初めて聞きました・・・調べてみます。
あと、
裏画面と実画面の関係が少しずつ見えてきました。

CreateCompatibleDC
CreateCompatibleBitmap

の関数と伴って調べてみます!

トンプソン 2005/03/14(月) 18:24:32
[[解決]]
いろいろ調べてみた結果、
EraseBackgroundを使用していました。
処理速度も考えメモリデバイスコンテキスト用CDCクラスを
メンバ変数にインスタンス化し、
EraseBackground内では画面の初期化(統一した色の塗りつぶし)
OnDraw内でBltBit
OnSize内にてメモリデバイスコンテキストの初期化を行いました。
PATIO さんありがとうございました。

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