ダブルバッファについて
スタート画面に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);
}
//以下は関数の定義なので省略
お礼
回答ありがとうございます。 どうやら画像のサイズを無理やり変更していたのが問題だったようです。 無事チラつきはなくなりました。 この先、詰まったときはまたよろしくお願いします。