ダブルバッファについて
スタート画面にBitmapを用いたアニメーションを用いて、次の場面に移動したいのですが
実行すると画面がちかちかしてしまいます。どう直せばよいか教えてもらえると助かります
プログラムはVisualStudio2008のMFCでやっています
#include "stdafx.h"
#include "graph.h"
#include "graphDoc.h"
#include "graphView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
//全域変数
CDC bkDC;
CBitmap bkBMP;
#define ID_REDRAW 30
#define TIMER_MS_FPS 1000/30
#define ID_BITMAP 60
#define TIMER_MS_BITMAP 300
#include <math.h>
int draw_state = 0;
float mouse_x = -1.0, mouse_y = -1.0;
// CgraphView
IMPLEMENT_DYNCREATE(CgraphView, CView)
BEGIN_MESSAGE_MAP(CgraphView, CView)
// 標準印刷コマンド
ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
ON_COMMAND(ID_BK_WHITE, &CgraphView::OnBkWhite)
ON_COMMAND(ID_BK_BLUE, &CgraphView::OnBkBlue)
ON_COMMAND(ID_BK_PINK, &CgraphView::OnBkPink)
ON_WM_TIMER()
ON_WM_DESTROY()
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()
// CgraphView コンストラクション/デストラクション
CgraphView::CgraphView()
: background_color(0)
, draw_state(0)
, Bmp_ID(0)
{
// TODO: 構築コードをここに追加します。
background_color = 0;
int draw_state = 0;
}
CgraphView::~CgraphView()
{
}
BOOL CgraphView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: この位置で CREATESTRUCT cs を修正して Window クラスまたはスタイルを
// 修正してください。
return CView::PreCreateWindow(cs);
}
// CgraphView 描画
void CgraphView::OnDraw(CDC* pDC)
{
CgraphDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: この場所にネイティブ データ用の描画コードを追加します。
//ダブルバッファに関するコード
CRect rc;
GetClientRect(&rc);
bkDC.CreateCompatibleDC(pDC);
bkBMP.CreateCompatibleBitmap(pDC, rc.right, rc.bottom);
bkDC.SelectObject(&bkBMP);
//描画は、裏画面bkDCにおいて行う
bkDC.FillSolidRect(rc, RGB(153, 204, 255));
int x, y, sx, sy;
if(draw_state == 0)
{
bkDC.SetTextColor(RGB(255, 255, 255));
bkDC.TextOut(480, 580, _T("Start"));
sx = 128;
sy = 128;
y = 340;
x = 200;
draw_school(x, y, sx, sy);//定義は省略
x = 400;
draw_health(x, y, sx, sy);//定義は省略
x = 600;
draw_environment(x, y, sx, sy);//定義は省略
}
else if(draw_state == 1)
{
CRect myRect;
GetClientRect(myRect);
pDC->FillSolidRect(myRect, RGB(0, 0, 0));
}
//裏画面を表画面に送る
//pDC->BitBlt(0, 0, rc.right, rc.bottom, &bkDC, 0, 0, SRCCOPY);
//裏画面を消去
bkBMP.DeleteObject();
bkDC.DeleteDC();
//実行画面のプログラムを省略
void CgraphView::OnInitialUpdate()
{
CView::OnInitialUpdate();
// TODO: ここに特定なコードを追加するか、もしくは基本クラスを呼び出してください。
bitmap[0].LoadBitmap(IDB_BITMAP1);
bitmap[1].LoadBitmap(IDB_BITMAP2);
bitmap[2].LoadBitmap(IDB_BITMAP3);
bitmap[3].LoadBitmap(IDB_BITMAP4);
bitmap[4].LoadBitmap(IDB_BITMAP5);
bitmap[5].LoadBitmap(IDB_BITMAP6);
//タイマーをスタート
SetTimer(ID_BITMAP, TIMER_MS_BITMAP, NULL);
//画面再描画のタイマーをスタートする
SetTimer(ID_REDRAW, TIMER_MS_FPS, NULL);
Bmp_ID = 0;
}
void CgraphView::OnTimer(UINT_PTR nIDEvent)
{
// TODO: ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。
if(nIDEvent == ID_BITMAP)
Bmp_ID = (Bmp_ID+1) % 2;
if(nIDEvent == ID_REDRAW)
InvalidateRect(NULL, FALSE);
CView::OnTimer(nIDEvent);
}
void CgraphView::OnDestroy()
{
CView::OnDestroy();
// TODO: ここにメッセージ ハンドラ コードを追加します。
KillTimer(ID_BITMAP);
KillTimer(ID_REDRAW);
}
void CgraphView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。
mouse_x = point.x;
mouse_y - point.y;
if(draw_state == 0)
{
if(mouse_x > 420 && mouse_y > 500)
{
draw_state = 1;
}
}
CView::OnLButtonDown(nFlags, point);
}
//以下は関数の定義なので省略
お礼
とてもわかりやすい回答ありがとうございました。 アサートの調べ方も教えていただきありがとうございます。