スクロール時の描画方法 – プログラミング – Home

スクロール時の描画方法
 
通知
すべてクリア

スクロール時の描画方法


さおり
 さおり
(@さおり)
ゲスト
結合: 23年前
投稿: 31
Topic starter  

こんばんは。さおりと申します。
いつもお世話になっております。

CScrollViewを使って画像をスクロールする際のことで質問です。
環境は、WinMe


引用解決済
トピックタグ
さおり
 さおり
(@さおり)
ゲスト
結合: 23年前
投稿: 31
Topic starter  

すみません、途中で送信してしまいました。

CScrollViewを使って画像をスクロールする際のことで質問です。
環境は、WinMe VC++ MFCです。

ScrollViewのOnDrawで画像をScrollViewに貼り付けているのですが
スクロールさせた際に、なめらかなスクロールになりません。

ペイントなどでスクロールさせるとぜんぜんなめらかに
スクロールするようです。

不必要な部分まで描画させているために処理が遅くなっているのが
原因と思っていますが、ただしいでしょうか?

もし正しいとしたら、どのような処理をしたらよいのでしょうか?
ご教授願います。


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

> 不必要な部分まで描画させているために処理が遅くなっているのが
> 原因と思っていますが、ただしいでしょうか?

CDC::GetClipBox()で書き換えるべき領域が取得できます。
その部分だけ描画するようにしてみると良いかもしれません。


返信引用
匿名希望
 匿名希望
(@匿名希望)
ゲスト
結合: 23年前
投稿: 2
 

こんにちは、さおりです。
DairyGoodsさんレスありがとうございます。
GetClipBox()使ってみました。下のようなコードになったのですが、
結論としては、前と変わらなかったです。
//でコメント合うとしている部分はGetClipBox()を使う前のところです。
GetClipBox()の使い方が悪いのでしょうか?
それとも、OnDrawではなく、スクロールボタンが押されたところで
何らかの処理をするべきなのでしょうか?

void CGraphView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
RECT rect;
pDC->GetClipBox(&rect);
CBitmap myBMP;
myBMP.LoadBitmap(IDB_BITMAP1);
CDC myDC;
myDC.CreateCompatibleDC(pDC);
CBitmap *oldBMP = myDC.SelectObject(&myBMP);
pDC->BitBlt(rect.left,rect.top,rect.right, rect.bottom,&myDC,
rect.left, rect.top, SRCCOPY);
// pDC->BitBlt(0, 0, 1024, 768, &myDC, 0, 0, SRCCOPY);
myDC.SelectObject(oldBMP);

// TODO: この位置に描画用のコードを追加してください
}


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

BitBltの第3,4引数は幅と高さですよ。

あと、ビットマップは毎回ロードせず
何処かの初期化処理で読み込んでおきましょう。

メモリDCを作る処理はそんなに重くないと思いますが、
これも初期化時にあらかじめ作っておくと良いでしょう。


返信引用
さおり
 さおり
(@さおり)
ゲスト
結合: 23年前
投稿: 31
Topic starter  

こんにちは。さおりです。
dairygoodsさんのおっしゃる通りビットマップのロードと
メモリDCの作製を1回しか行わない様にしました。
InitialUpDateの所でビットマップを読み込んで、
メモリDCの作製は下の通りに行ないました。
(InitialUpdateのなかで、pDCを持ってくる方法がわからなかった)

結果、スクロールは前に比べるとスムーズに動くようになりました。
しかし、同じ画像をペイントなどでスクロールさせた場合と比べると
まだ、白いちらちらがでます。(特に左右に動かした場合)
依然として余計な作業が入っているのでしょうか?

何回も申し訳ないですが教えて下さい。

void CGraphView::OnDraw(CDC* pDC)
{
static int i = 0;
if (i == 0){
myDC.CreateCompatibleDC(pDC);
i = 1;}

RECT rect;
pDC->GetClipBox(&rect);

CBitmap *oldBMP = myDC.SelectObject(&myBMP);

pDC->BitBlt(rect.left, rect.top,
rect.right - rect.left, rect.bottom - rect.top,
&myDC, rect.left, rect.top, SRCCOPY);

myDC.SelectObject(oldBMP);
}


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

OnEraseBkgnd()は記述していますか?

もし、画像をビュー全体に描画しているのでしたら、
OnEraseBkgnd()では、何もする必要はありません。
(return TRUE)

一部分でも背景が見えるのでしたら、
背景が見える部分だけを塗りつぶすようにしてください。

>(InitialUpdateのなかで、pDCを持ってくる方法がわからなかった)

CClientDC dc(this);
mDC.CreateCompatibleDC(&dc);


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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