Usted no esta registrado, haga click aqui para registrarse!
 Inicio   Artículos   Recursos   Foros 
 

Iniciar sesión

¿No estas registrado?
Registrate en Latindevelopers.com!

 



Como implementar Double Buffering en Visual C++

Enviado por: Ivan Cachicatari

Double Buffering.

En computacion grafia, doble buffer es una tecnica para reducir el parpadeo producido al dibujar en la pantalla. Esta tecnica es muy util para cuando tenemos varios segmentos de imagen complejos por dibujar, por ejemplo el movimiento de un objeto complejo sobre una ventana.

Implementación.

Este articulo te mostrará como implementar la tecnica de Double Buffering en tus proyectos Visual C++. Una forma clasica de demostrar esto es pintanto un fondo complejo y dibujando sobre él un objeto en movimiento, esto normalmente produce un parpadeo fastidioso:

void CChildView::PaintScenario(CDC *pDC)
{
	int step = (m_size.cy)/16;
	pDC->FillSolidRect(0,0,m_size.cx,m_size.cy,RGB(255,255,255));
	for(int i = 0 ; i < 16;i++)
	{
		pDC->FillSolidRect(10,10+i*step,m_size.cx-20,(i+1)*step,RGB(16*i,16*i,16*i));
	}
	pDC->Ellipse(m_size.cx/2-60,m_iPos-60,m_size.cx/2+60,m_iPos+60); 
}

El codigo anterior dibuja algo como la Imagen 1, la variable CSize m_size contiene las dimensiones del entorno,int m_iPos es la posicion actual de la esfera.

Circulo blanco sobre fondo negro
Imagen 1: Circulo blanco sobre fondo negro

El codigo puede agregarse en una vista estándar (CView) o en un dialogo. Necesitamos un Bitmap y un DC (Device Context) donde dibujaremos temporalmente la imagen para luego mostrarla en pantalla. (Ver Imagen 2).

 Double Buffering
Imagen 2: Esquema de Double Buffering

Codificacion:

  1. Agregar a la clase de la vista, una variable de tipo CBitmap, ésta variable será nuestra nuestra imagen en segundo plano.

    CBitmap m_bmpOffScreen;
  2. En la funcion OnPaint escribir el codigo para Inicializar el CBitmap con las dimensiones del entorno (a); Crear el DC y seleccionarlo (b), Usar el DC creado para pintar (c) y Finalmente Mostrar el Bitmap en pantalla (d). codigo.
    void CChildView::OnPaint() 
    {
        CPaintDC dc(this); // device context for painting
    
    
        if(m_bmpOffScreen.m_hObject == NULL) (a)
        {
            m_bmpOffScreen.CreateCompatibleBitmap( &dc, m_size.cx, m_size.cy );
        }
    
        CDC imageDC; (b)
        imageDC.CreateCompatibleDC(&dc);
    
        CBitmap* pOldBitmap = NULL;
    
        pOldBitmap = (CBitmap*)imageDC.SelectObject(&m_bmpOffScreen);
    
        PaintScenario(&imageDC);  (c)
    
        dc.BitBlt( 0, 0, m_size.cx, m_size.cy, 
                        &imageDC, 0, 0, SRCCOPY );  (d)
    
        imageDC.SelectObject(pOldBitmap);
        imageDC.DeleteDC();
    }
    
    
  3. Escribir el codigo necesario para liberar el bitmap, en el destructor.
    CChildView::~CChildView()
    {
        if(m_bmpOffScreen.m_hObject != NULL) 
        {
            m_bmpOffScreen.DeleteObject();
            m_bmpOffScreen.m_hObject = NULL;
        }
    }

 

Ustedes pueden personalizar la funcion PaintScenario de acuerdo a las necesidades de su programa. Hay otras formas de implementar Double Buffering, esta es solo una muestra.

Pueden descargar el proyecto de ejemplo para ver en accion a esta técnica.

 

Descargas

Acerca del Author

Nombre de usuario: latindeveloper
Blog/URL:
Fecha de envío: 2006-06-19
Ultima Actualización:
Visualizaciones: 7442
Nedstat Basic - Web site estadisticas gratuito
El contador para sitios web particulares