DCへ描画した絵を記憶するには?

[戻る]
はむくん 2010/06/27(日) 00:20:15
=ヘッダ(抜粋)=
class CTest001View : public CScrollView
{
public:
 CBitmap m_Bitmap;

=ソース(抜粋)=
void CTest001View::OnDraw(CDC* pDC)
{
 CDC tmpDC;
 tmpDC.CreateCompatibleDC(pDC);

 CBitmap *tmpBMap = tmpDC.SelectObject(&m_Bitmap);

 //とりあえずBitBltするテスト
 pDC->BitBlt(0,0,1000,1000,&tmpDC,0,0,SRCCOPY);
}

void CTest001View::OnInitialUpdate()
{
 CDC *dc = GetDC();
 m_Bitmap.CreateCompatibleBitmap(dc, 1600, 1600);

 CBitmap *oldBMap = dc->SelectObject(&m_Bitmap);

 //試しにFillRectしてみる。実際にはここで図画作成処理を行う。
 dc->FillRect(CRect(0,0,1600,1600),&CBrush(RGB(255,0,0)));

 dc->SelectObject(oldBMap);
 ReleaseDC(dc);
}

あまり変更が無いが、毎回書き直すにはヘビーな図画をCBitmapオブジェクトへ
保持しておこうと考えたのですが、上記のソースを実行しても1000x1000の真っ黒な
四角が表示されるだけです。
初期化されたCBitmapオブジェクトが表示されてるだけの様子。

以前、見かけたソースコードのアイデアをそのままパクったはずなのですが上手くいき
ません。
そのコードも1つのCBitmapオブジェクトを使いまわし、初期描画(?)は一回だけでし
た。
アドバイスをお願いします。

デゴルガン 2010/06/27(日) 16:41:30
OnInitialUpdate でも CreateCompatibleDC でビットマップ用の DC を作る必要がある
と思います。

はむくん 2010/06/27(日) 19:28:21
[[解決]]
回答ありがとうございます!

void CTest001View::OnInitialUpdate()
{
 CDC *dc = GetDC();

 CDC mDC;
 mDC.CreateCompatibleDC(dc);

 m_Bitmap.CreateCompatibleBitmap(mDC, 1600, 1600);

 CBitmap *oldBMap = mDC.SelectObject(&m_Bitmap);

 mDC.FillRect(CRect(0,0,1600,1600),&CBrush(RGB(255,0,0)));

 mDC.SelectObject(oldBMap);
 ReleaseDC(dc);
}

こんなふうに修正して期待通りの動作を得ることができました!

はむくん 2010/06/27(日) 19:32:19
違った・・・
×m_Bitmap.CreateCompatibleBitmap(&mDC, 1600, 1600);
○m_Bitmap.CreateCompatibleBitmap(dc, 1600, 1600);

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