裏画面を使った高速な描画とビューの背景色

[戻る]
たにし 2002/04/23(火) 15:08:58
はじめまして。たにしといいます。

bmpを表示するだけのプログラムで画面のちらつきを抑えるために、
1.裏画面を使う
2.CView::OnEraseBkgnd(CDC* pDC) { return TRUE;}
の二つの方法を用いました。そして上手くいきました。

しかし今まで、CView::OnEraseBkgndではビューの背景色を指定していました。
ところが2の方法を使ったために、背景色の指定ができなくなってしまいました。
そこで一度クライアント領域サイズのビットマップを塗りつぶしてから、
描画したいビットマップを上書きするという方法をとりました。
なんだか無駄が多いような気がするのです。
かといってCView::OnEraseBkgndで背景色を指定すると
やっぱりちらついてしまいます。

どうしたらよいでしょうか?
よろしくお願いします。

たにし 2002/04/23(火) 15:14:20
ソースです。

CDC    MemDC;
CBitmap* pMemBmp, MemBitmap;
LONG lWidth = (LONG)(pCDIBit->GetWidth() * m_dViewRate);
LONG lHeight = (LONG)(pCDIBit->GetHeight() * m_dViewRate);
LONG lMemHeight, lMemWidth;
CRect rect;

GetClientRect(&rect);

//クラインアント領域と表示される画像の大きさを比べる
if((lMemHeight = rect.Height()) < lHeight)
    lMemHeight = lHeight;
if((lMemWidth = rect.Width()) < lWidth)
    lMemWidth = lWidth;

MemDC.CreateCompatibleDC(pDC);
MemBitmap.CreateCompatibleBitmap(pDC, lMemWidth, lMemHeight);
pMemBmp = MemDC.SelectObject(&MemBitmap);

//背景塗りつぶし
MemDC.FillRect(rect, &CBrush(RGB(0xa0, 0xa0, 0xa0)));

//メモリDCに描画
pDoc->m_BMP->DrawDIB(&MemDC, lHeight, lWidth);

//画面に転送
pDC->BitBlt(0, 0, lMemWidth, lMemHeight, &MemDC, 0, 0, SRCCOPY);

不良PG 2002/04/23(火) 15:51:46
>なんだか無駄が多いような気がするのです。
何を根拠に無駄だと思ったのでしょうか?
CWnd::OnEraseBkgndの戻り値で0(FALSE)を指定した時点で
ウインドウズがWM_ERASEBKGNDを受けた背景の塗りつぶし処理を行わないので、
代わりに自分で背景の塗りつぶし処理を行うことは、別に無駄とは、思えませんが・・


ちなみに、私も同じように書いています

たにし 2002/04/23(火) 15:59:03
[[解決]]
不良PGさんありがとうございます。

>>なんだか無駄が多いような気がするのです。
>何を根拠に無駄だと思ったのでしょうか?
言い方が悪かったです。
無駄というか、他に背景色を指定できる方法は
ないのかな?と思ったしだいです。
質問の仕方が悪くてすいませんでした。
OnEdaseBkgnd以外で背景色を指定する
サンプルなどを探して、試しても上手くいかなかったので質問しました。

>ちなみに、私も同じように書いています
そうですか。ありがとうございました。
考え方は間違っていなかったってことでホットしました。

不良PG 2002/04/23(火) 16:09:37
>言い方が悪かったです。
すみません、私の言い方の方が悪かったですね m(_ _)m

ついでですが、
この処理は、

裏画面を使った高速な描画とビューの背景色

と言うより

裏画面を使ったちらつかない描画とビューの背景色

って感じです。

この処理は、決して速くありません。

dairygoods 2002/04/23(火) 16:27:17
> なんだか無駄が多いような気がするのです。

背景色で塗った上にビットマップを上書きしているので、
無駄と言えば無駄かもしれませんね。

この2度塗りがイヤであれば、

> //背景塗りつぶし
> MemDC.FillRect(rect, &CBrush(RGB(0xa0, 0xa0, 0xa0)));

の代わりに、
下図の矩形A, B, Cを求めて塗りつぶせばよいでしょう。
+-------------+---+
|             |   |
| ビットマップ | A |
|             |   |
+-------------+---+
|     B       | C |
+-------------+---+

たにし 2002/04/23(火) 19:34:12
[[解決]]
不良PGさん
>>言い方が悪かったです。
>すみません、私の言い方の方が悪かったですね m(_ _)m
そ、そんなあやまらないでくださいよ(^^;
私の説明&理解不足なんですから

>裏画面を使ったちらつかない描画とビューの背景色
>って感じです。
>この処理は、決して速くありません。
そうだったのですか。。。この点も理解不足でした。
ひとつ勉強になりました。ありがとうございます。
#たしかに、「ちらつかない」とはあったけど「高速」とは
#書いていないサンプルもあったな。。。


dairygoodsさんありがとうございます。
>下図の矩形A, B, Cを求めて塗りつぶせばよいでしょう。
+-------------+---+
|             |   |
| ビットマップ | A |
|             |   |
+-------------+---+
|     B       | C |
+-------------+---+
なるほど、こういう考え方もありますね。
参考になります。

皆さんどうもありがとうございました。
また何かあればよろしくお願いします。

kazuma 2002/04/24(水) 00:28:22
ビットマップを描画したあと、
その範囲をExcludeClipRectして、
最後にFillSolidRectするという方法もあります。

この方法だと裏画面を使わずに済みます。

たにし 2002/04/24(水) 10:10:26
kazumaさんありがとうございます。

>ビットマップを描画したあと、
>その範囲をExcludeClipRectして、
>最後にFillSolidRectするという方法もあります。

>この方法だと裏画面を使わずに済みます。

execludeClipRectがわからないので
これから調べます。

ご助言ありがとうございます

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