ダブルバッファリング – プログラミング – Home

通知
すべてクリア

ダブルバッファリング


misae
 misae
(@misae)
ゲスト
結合: 21年前
投稿: 7
Topic starter  

こんにちは、以前からお世話になっています

現在、SetTimerとInvalidateRectを使ってキャラクターをアニメーションさせる
プログラムを作っています。

しかしInvalidateRectで画面更新のために毎回クリアを行うと「ちらつき」が見えるのです
ここで画面のちらつきを無くすために、ダブルバッファリングを用いたいのですが

各所で調べた所、
1.InvalidateRect(,,,FALSE)にして画面クリアを行わない。
2.逐次の描画処理は用意した裏MemoryDCに対して行う
3.すべての描画処理がおわってから裏MemoryDCから表画面に転送して「上書き」をする。

といった概念は理解できたのですが
実際にコードを書くと上手く動いてくれません。(サンプルはJAVAしか見つからないし・・・
こちらのページでも検索させていただきましたが、なかなか理解できないのです。

下記にコードをUPいたしましたので、お手数ですがどこが悪いのかご指摘いただけないで
しょうか
どうかお願いいたします。

*ダブルバッファリングを用いたが動いてくれないプログラム
Yahooブリーフケース(pika_hoshi1.zip)
ID:programing_00
pass:aaabbb

*画面はちらつくが一応キチンと動くプログラム
Yahooブリーフケース(pika_hoshi_v100.zip)
ID:programing_00
pass:aaabbb

開発環境は
VC++Toolkit2003とCoreSDKです。


引用解決済
トピックタグ
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 24年前
投稿: 1421
 

基本的にはこんな感じ。
http://www-online.kek.jp/~keibun/win32prog/paint.html


返信引用
n
 n
(@n)
ゲスト
結合: 22年前
投稿: 90
 

ちなみに各API呼び出し時のエラーチェックは必ず行うべきですが、やってますか?


返信引用
SunPac
 SunPac
(@SunPac)
ゲスト
結合: 22年前
投稿: 105
 

Timer使ってるってことはWM_TIMERでInvalidateRect(hWnd, NULL, FALSE)してる
かと思うのですが、InvalidateRect()する前に裏MemoryDCに描画内容を書かなければ
なりません。
もちろん内容変更がなければそのままでいいのですが。

WM_PAINTは裏から表に転送するだけ(Flipって言ったらいいかな)です。
Timerはメッセージの優先順位が低いのでスムーズなアニメーションにならないかも
しれませんが、描画自体が重くなければ大丈夫でしょう。

ちなみにBitBltの処理は

WM_PAINT:
{


返信引用
SunPac
 SunPac
(@SunPac)
ゲスト
結合: 22年前
投稿: 105
 

送信いてしまった・・・

WM_PAINT:
{
PAINTSTRUCT ps;
BeginPaint(hWnd, &ps);
BitBlt(ps.hdc, ps.rcPaint.left, ps.rcPaint.top,
ps.rcPaint.right-ps.rcPaint.left,
ps.rcPaint.bottom-ps.rcPaint.top,
memdc, ps.rcPaint.left, ps.rcPaint.top, SRCCOPY);
EndPaint(hWnd, &ps);
}
break;

みたいな感じで。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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