裏画面を使った高速な描画とビューの背景色 – プログラミング – Home

裏画面を使った高速な描画とビューの背景...
 
通知
すべてクリア

[解決済] 裏画面を使った高速な描画とビューの背景色


たにし
 たにし
(@たにし)
ゲスト
結合: 23年前
投稿: 11
Topic starter  

はじめまして。たにしといいます。

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

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

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


引用未解決
トピックタグ
たにし
 たにし
(@たにし)
ゲスト
結合: 23年前
投稿: 11
Topic starter  

ソースです。

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
 不良PG
(@不良PG)
ゲスト
結合: 23年前
投稿: 188
 

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

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


返信引用
たにし
 たにし
(@たにし)
ゲスト
結合: 23年前
投稿: 11
Topic starter  

不良PGさんありがとうございます。

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

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


返信引用
不良PG
 不良PG
(@不良PG)
ゲスト
結合: 23年前
投稿: 188
 

>言い方が悪かったです。
すみません、私の言い方の方が悪かったですね m(_ _)m

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

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

と言うより

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

って感じです。

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


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

> なんだか無駄が多いような気がするのです。

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

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

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

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


返信引用
たにし
 たにし
(@たにし)
ゲスト
結合: 23年前
投稿: 11
Topic starter  

不良PGさん
>>言い方が悪かったです。
>すみません、私の言い方の方が悪かったですね m(_ _)m
そ、そんなあやまらないでくださいよ(^^;
私の説明&理解不足なんですから

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

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

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


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

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

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


返信引用
たにし
 たにし
(@たにし)
ゲスト
結合: 23年前
投稿: 11
Topic starter  

kazumaさんありがとうございます。

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

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

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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