Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Para Que La Imagen No Parpadee Visual C++

Iniciado por pekesan, 17 de Marzo de 2004, 12:34:39 AM

« anterior - próximo »

pekesan

 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.

Zaelsius

 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.

BeRSeRKeR

 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.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

fiero

 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
www.videopanoramas.com Videopanoramas 3D player

pekesan

 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

BeRSeRKeR

 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.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

pekesan

 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



shephiroth

 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.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.