|
画像をちらつかせずに描画する |
|
// ------------------------------------------------------------------ // 背景を描画しない // ------------------------------------------------------------------ BOOL CFooWnd::OnEraseBkgnd(CDC* pDC) { return TRUE; } |
|
// --------------------------------------------------------------------- // 再描画処理 // --------------------------------------------------------------------- void CFooWnd::OnPaint() { // クライアント領域のサイズを取得する CRect rc; GetClientRect(&rc); // DC を取得する CPaintDC dc(this); // 裏画面用の DC を作成する CDC dcMem; dcMem.CreateCompatibleDC(&dc); // 裏画面作成用のビットマップを用意する CBitmap bmp; bmp.CreateCompatibleBitmap(&dc, rc.Width(), rc.Height()); CBitmap* pOldBmp = dcMem.SelectObject(&bmp); // 〜 dcMem に対して各種描画処理を行う 〜 // 下記のコードは例として書きました dcMem.FillSolidRect(&rc, RGB(0,0,0)); for (int i = 0; i < 100; i++) { CPen pen(PS_SOLID, 5, RGB(rand() & 0xFF, rand() & 0xFF, rand() & 0xFF)); CPen* pOldPen = dcMem.SelectObject(&pen); dcMem.MoveTo(rand() % rc.Width(), rand() % rc.Height()); dcMem.LineTo(rand() % rc.Width(), rand() % rc.Height()); dcMem.SelectObject(pOldPen); } // 裏画面(dcMem)から表画面(dc)に一気に画像を転送する dc.BitBlt(0, 0, rc.Width(), rc.Height(), &dcMem, 0, 0, SRCCOPY); dcMem.SelectObject(pOldBmp); } |