MFCプログラミング
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);
}
お礼
お忙しい中ご返信ありがとうございます! OnPaintでやってみましたが, OnMouseMoveにInvalidateを置く限り 矩形が消えてしまいます。 ご返信頂いてMFCを目を皿にして探索したところ, 「DrawDragRect」という関数がありました。 この関数で矩形をマウスで動かせました。 当方の経験不足が一番の問題であったようです・・ ですが!OnPaintでも矩形を作る方法がある事を 認識できた事も経験でき,感謝しております。 bluecampus殿には,引き続きご支援の程, よろしくお願い致します。