こんにちは、以前からお世話になっています
現在、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です。
ちなみに各API呼び出し時のエラーチェックは必ず行うべきですが、やってますか?
Timer使ってるってことはWM_TIMERでInvalidateRect(hWnd, NULL, FALSE)してる
かと思うのですが、InvalidateRect()する前に裏MemoryDCに描画内容を書かなければ
なりません。
もちろん内容変更がなければそのままでいいのですが。
WM_PAINTは裏から表に転送するだけ(Flipって言ったらいいかな)です。
Timerはメッセージの優先順位が低いのでスムーズなアニメーションにならないかも
しれませんが、描画自体が重くなければ大丈夫でしょう。
ちなみにBitBltの処理は
WM_PAINT:
{
送信いてしまった・・・
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;
みたいな感じで。