こんにちわ。
今、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();
間違えました。
pDC -> BitBlt( (nCount)*25+3 , 3 , 70 , 70 , ***** , 0 , 0 , SRCPAINT ) ;
です。
> //TestDc.SelectObject( &Cbmp ) ;//OK
これは、TestDc に IDB_TEST から読み込んだビットマップ(Cbmp)をセットします。
> //TestDc.SelectObject( pTmpBitmap ) ;//NG????
これは、TestDc に、TestDcを最初に作ったときに設定してあった
ビットマップをセットします。
ちなみに、メモリDCを最初に作ったときに設定してあるビットマップとは、
1x1 の 白黒ビットマップで、ほとんどの場合使い物になりません。
そして、
pDC -> BitBlt( ..., &TestDc, 0 , 0 , SRCPAINT ) ;
とすると、TestDc にセットされているビットマップの内容を、
画面に転送します。
実画面と同じ描画を裏で行いたい場合は、
普通なら実画面にコンパチブルなビットマップを作成して裏画面で選択すると思います。
裏画面で描画するというのは、この場合で言えば、TestDCに対してGDIを呼び出して
描画しておき、描画が終わったタイミングで裏画面(TestDC)から実画面へ画像を転送する
事で表示させるはずです。
単に裏画面のビットマップを表に転送しても意味がないと思います。
裏画面にビットマップを作成するのは、裏画面で行った描画内容を実画面に転送する時に
裏画面上にビットマップを作成しておかないと画像転送が出来ないからです。
裏画面に実画面にコンパチブルなビットマップを作成すると言うのは、
多分、画板に画用紙をセットするようなイメージでいいと思います。
この場合、裏画面用のDCが画板になり、選択するコンパチブルなビットマップが画用紙に
当たると考えれば良いのではないでしょうか。
なぜ、コンパチブルなビットマップを作るべきなのかは、dairygoodsさんの説明を読めば、
一目瞭然かと思います。
dairygoodsさんお返事ありがとうございます。
なんとなく分かってきました。
TestDc.SelectObject( &Cbmp ) ;//OK
pDC -> BitBlt( ..., &TestDc, 0 , 0 , SRCPAINT ) ;
このセットで描画って事ですよね?
ただ、このコードを何度も処理されるので
画面にちらつきが出てしまうんです・・・・。
そこで、メモリデバイスコンテキストがいいと思ったので。
作っているとこだったんです。。
ちらつき防止策でなにかいい案ないでしょうか・・・?
ちらつきと言うことですが、
MFCのフレームワーク側が行っているEraseBackgroundは無効にしていますか?
これが有効だと自分で背景を塗潰している場合に二回塗潰されてしまうので
ちらつきの原因になります。
あとは、私が書いている内容を読んで考えてみてください。
バックバッファを使った描画を紹介した文書であれば、同じような内容が書かれているは
ずです。
PATIOさんお返事ありがとうございます!
>EraseBackground
初めて聞きました・・・調べてみます。
あと、
裏画面と実画面の関係が少しずつ見えてきました。
CreateCompatibleDC
CreateCompatibleBitmap
の関数と伴って調べてみます!
いろいろ調べてみた結果、
EraseBackgroundを使用していました。
処理速度も考えメモリデバイスコンテキスト用CDCクラスを
メンバ変数にインスタンス化し、
EraseBackground内では画面の初期化(統一した色の塗りつぶし)
OnDraw内でBltBit
OnSize内にてメモリデバイスコンテキストの初期化を行いました。
PATIO さんありがとうございました。