dポイントプレゼントキャンペーン実施中!

MFCのダブルバッファリングを用いて画面を切り替えるプログラムを作ったのですが
画面がちらついてしまいます、どう修正すればよいか教えてください
// CgraphView 描画

void CgraphView::OnDraw(CDC* pDC)
{

CgraphDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;

// TODO: この場所にネイティブ データ用の描画コードを追加します。
CRect myRect;
GetClientRect(myRect);
if(background_color == 0)
pDC->FillSolidRect(myRect, RGB(255, 255, 255));
else if(background_color == 1)
pDC->FillSolidRect(myRect, RGB(153, 204, 255));
else
pDC->FillSolidRect(myRect, RGB(255, 153, 204));
//ダブルバッファに関するコード
CRect rc;
GetClientRect(&rc);
bkDC.CreateCompatibleDC(pDC);
bkBMP.CreateCompatibleBitmap(pDC, rc.right, rc.bottom);
CBitmap Bitmap, *pOldBitmap;
pOldBitmap = bkDC.SelectObject(&bkBMP);
//これから、すべての描画は、裏画面bkDCにおいて行う
bkDC.FillSolidRect(rc, RGB(255, 255, 255));
int x, y, sx, sy;

if(draw_state == 0)
{
bkDC.SetTextColor(RGB(0, 0, 0));
bkDC.TextOut(400, 500, _T("Start"));

sx = 128;//表示するビットマップの横の大きさ
sy = 128;//表示するビットマップの縦の大きさ
y = 300;//表示するビットマップの左上の頂点のy座標

x = 50;
draw_school(x, y, sx, sy);

x = 200;
draw_health(x, y, sx, sy);

x = 350;
draw_environment(x, y, sx, sy);
}

else if(draw_state == 1)
{
CRect myRect;
GetClientRect(myRect);
pDC->FillSolidRect(myRect, RGB(255, 255, 255));
}


//裏画面bkDCにおいて、すべての描画を行った後
//裏画面を表画面に送る
pDC->BitBlt(0, 0, rc.right, rc.bottom, &bkDC, 0, 0, SRCCOPY);
bkDC.SelectObject(pOldBitmap);
//裏画面を消去
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);
Bmp_ID = 0;
//タイマーをスタート
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 > 400 && mouse_y > 500)
{
draw_state = 1;
}
}

CView::OnLButtonDown(nFlags, point);
}

BOOL CgraphView::OnEraseBkgnd(CDC* pDC)
{
// TODO: ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。
return TRUE;

//return CView::OnEraseBkgnd(pDC);
}

A 回答 (11件中11~11件)

>BOOL CgraphView::OnEraseBkgnd(CDC* pDC)


>{
>return TRUE;
>}

は正しいとして……

>if(background_color == 0)
>pDC->FillSolidRect(myRect, RGB(255, 255, 255));
>else if(background_color == 1)
>pDC->FillSolidRect(myRect, RGB(153, 204, 255));
>else
>pDC->FillSolidRect(myRect, RGB(255, 153, 204));

が、なにをやっているのか説明できますか?
その上で、

>bkDC.FillSolidRect(rc, RGB(255, 255, 255));
>pDC->FillSolidRect(myRect, RGB(255, 255, 255));
>pDC->BitBlt(0, 0, rc.right, rc.bottom, &bkDC, 0, 0, SRCCOPY);

のそれぞれがどういう結果をもたらすのか理解できますか?

この回答への補足

>if(background_color == 0)
>pDC->FillSolidRect(myRect, RGB(255, 255, 255));
>else if(background_color == 1)
>pDC->FillSolidRect(myRect, RGB(153, 204, 255));
>else
>pDC->FillSolidRect(myRect, RGB(255, 153, 204));

上の部分はダイアログで背景を変える設定です

補足日時:2012/07/15 14:08
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!