Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: pekesan en 17 de Marzo de 2004, 12:34:39 AM

Título: Para Que La Imagen No Parpadee Visual C++
Publicado por: pekesan en 17 de Marzo de 2004, 12:34:39 AM
 Bueno, pues ya he conseguido que funcione el Timer de los ******* y en la función que se ejecuta cuando llega el WM_TIMER lo que hago es dibujar el campo de juego con los valores actualizados, pero el caso es que parpadea que no veas, así que a ver si me podiaís echar una mano para que no parpadease, si es que tengo que fijar una frecuencia determinada o si es que tengo que ponerle algún atributo especial a la ventana o al CDC.


Gracias por adelantado.
Título: Para Que La Imagen No Parpadee Visual C++
Publicado por: Zaelsius en 17 de Marzo de 2004, 09:11:07 PM
 Mientras sigas usando el GDI(es lo que usas no?) no hay manera humana de evitar el parpadeo. Tendrás que tirar de OpenGL/DirectX o una librería gráfica como SDL o Allegro para evitarlo.
Título: Para Que La Imagen No Parpadee Visual C++
Publicado por: BeRSeRKeR en 17 de Marzo de 2004, 10:02:36 PM
 En teoría deberías poder hacer un doble buffer teniendo un bitmap en memoria que es donde se compondría la escena y finalmente se volcaría al contexto de dispositivo.

Eso evitaría el parpadeo. Aún así, siempre he leído que es importante sobrecargar el mensaje ERASEBACKGROUND (o algo así) para que no repinte el fondo continuamente.

Tal vez GDI+ contemple todas estas cosas pero no sabría decirte.

Saludos.
Título: Para Que La Imagen No Parpadee Visual C++
Publicado por: fiero en 17 de Marzo de 2004, 10:15:38 PM
 Exacto, basta con que captures el mensaje WM_ERASEBKGND y elimines la llamada a la clase padre que borra el fondo.

Tambien puedes editar la función PreCreateWindow(CREATESTRUCT& cs) de tu ventana e incluir el código:

cs.lpszClass=AfxRegisterWndClass(0);

eso hace que no se repinte el fondo.

Utilizar GDI solo para hacer el doble buffer es más rápido de lo que parece.

un saludo
Título: Para Que La Imagen No Parpadee Visual C++
Publicado por: pekesan en 18 de Marzo de 2004, 12:17:53 AM
 Pues muchas gracias por las contestacion señores, ahora una pregunta indiscrete ¿ande ******* está esa información en el MSN? En fín, yo creía que estos de los entornos gráficos lo tenía dominado pero ya veo que soy un pelagatos, supongo que toda esta complejidad del Visual C++ framework es a costa de conseguir más posibilidades de programación.
(ole)
Lo dicho, graciasssssssss
Título: Para Que La Imagen No Parpadee Visual C++
Publicado por: BeRSeRKeR en 18 de Marzo de 2004, 02:03:56 AM
 Mira tú por donde el primer resultado que me ha salido en Google "es tu amigo" es este:

CitarStep 1. Drawing without double buffering.

void CSampleView::OnDraw(CDC* pDC)
{
    CSampleDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);

    pDC->Rectangle(10, 10, 200, 200);   // any drawing code
}

Step 2. Create Draw finction which draws to device context.

void CSampleView::OnDraw(CDC* pDC)
{
    CSampleDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);

    Draw(pDC);
}

void CSampleView::Draw(CDC *pDC)
{
    pDC->Rectangle(10, 10, 200, 200);
}

Step 3. Overwrite OnEraseBkgnd anc convert OnDraw by the following way:

void CSampleView::OnDraw(CDC* pDC)
{
    CSampleDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);

    CDC memDC;
    CBitmap bmp;
    CRect rect;

    GetClientRect(&rect);
    memDC.CreateCompatibleDC(pDC);
    bmp.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
    memDC.SelectObject(&bmp);

    memDC.FillSolidRect(&rect, RGB(255, 255, 255));  // background

    // draw to memory DC
    Draw(&memDC);

    // draw from memory DC to the screen
    pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
}

void CSampleView::Draw(CDC *pDC)
{
    pDC->Rectangle(10, 10, 200, 200);   // any drawing code
}

BOOL CSampleView::OnEraseBkgnd(CDC* pDC)
{
    return TRUE;     
}

Now you have flicker-free drawing code. If you don't use MFC, you can do the same using API.

Creo que es exactamente lo que estás buscando. El paso 3 es el que implementa doble buffer. No es que sea el mejor trozo de código que he visto pero te servirá para hacerte una idea. :D

Saludos.
Título: Para Que La Imagen No Parpadee Visual C++
Publicado por: pekesan en 18 de Marzo de 2004, 06:09:34 PM
 Niquelaoooooooooooooooo, muchisimas gracias de nuevo por el codigo.

Tienes razon, debería haber mirado en google, en vez de "confiar" demasiado en el MSN.Procuro siempre buscar las cosas antes de preguntar, pero por lo visto buscaba en sitio inadecuado


Título: Para Que La Imagen No Parpadee Visual C++
Publicado por: shephiroth en 06 de Abril de 2004, 03:26:37 PM
 Wenas. Ese codigo es MFC, y la verdad no entiendo mucho de lo que pone. A ver si me podeis ayudar a pasar este embroyo a mi MDI........las ventanas las hago a mano, heredando de Form, por lo que muchos de los eventos que menciona el código no existen (por no decir ninguno de los 3 que hay xDD).

GRACIAS.