 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Alpha120 Lt


Registrado: 11 Mar 2007Mensajes: 99Ubicación: Sevilla, España
|
Publicado: Lun 28 May, 2007 1:21 am Asunto: Eliminar parpadeo al dibujar |
|
|
A ver si esta vez consigo explicarme bien, e intentaré exponer mi duda de la mejor forma posible.
Tengo una aplicación que dibuja una barra de 3 colores, primero verde, después pasa al amarillo y por último al rojo.
El código (muy simple, aunque para nada optimizado ) es éste:
[code]
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "fBarraColor.h"
//#include "fBarraColor2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void SubirBarra (void)
{
int inicio=0, x, y;
Form1->Image1->Canvas->Pen->Color = clGreen;
//ZONA VERDE
Form1->Image1->Canvas->MoveTo(inicio, 201);
for (y=201; y>=100; y--)
for (x=0; x<=104; x++)
{
Form1->Image1->Canvas->Brush->Style = bsClear;
Form1->Image1->Canvas->MoveTo(inicio, y);
Form1->Image1->Canvas->LineTo(x,y);
Form1->Image1->Refresh();
Application->ProcessMessages();
Sleep (0.01);
}
//ZONA AMARILLA
Form1->Image1->Canvas->Pen->Color = clYellow;
Form1->Image1->Canvas->MoveTo(inicio, 100);
for (y=100; y>=30; y--)
for (x=0; x<=104; x++)
{
Form1->Image1->Canvas->Brush->Style = bsClear;
Form1->Image1->Canvas->MoveTo(inicio, y);
Form1->Image1->Canvas->LineTo(x,y);
Application->ProcessMessages();
Sleep (0.01);
}
//ZONA ROJA
Form1->Image1->Canvas->Pen->Color = clRed;
Form1->Image1->Canvas->MoveTo(inicio, 30);
for (y=30; y>=0; y--)
for (x=0; x<=104; x++)
{
Form1->Image1->Canvas->MoveTo(inicio, y);
Form1->Image1->Canvas->LineTo(x,y);
Application->ProcessMessages();
Sleep (0.01);
}
}
//---------------------------------------------------------------------------
void BajarBarra (void)
{
int inicio=0, x, y;
Form1->Image1->Canvas->Pen->Color = clWhite;
//BORRAR BARRA
Form1->Image1->Canvas->MoveTo(inicio, 201);
for (y=0; y<=201; y++)
for (x=0; x<=104; x++)
{
Form1->Image1->Canvas->MoveTo(inicio, y);
Form1->Image1->Canvas->LineTo(x,y);
Application->ProcessMessages();
Sleep (0.01);
}
}
void __fastcall TForm1::FormActivate(TObject *Sender)
{
Application->ProcessMessages();
SubirBarra();
Sleep (50);
BajarBarra();
ShowMessage ("FIN");
Close();
}
Ahora bien, a la hora de ejecutar el programa, me sale parpadeando. Me he estado informando y parece que es un error al escribir a la memoria de vídeo, que se forma un cuello de botella y de ahí el parpadeo.
He visto algo que se llama Double buffering, y parece ser que consiste en dibujar en otro TImage lo que sea y después, cada cierto tiempo, copiarlo.
Lo he visto en Java, en C#, pero en C++ nada...
Alguien me echa una mano??
César, he visto lo de tu barra de progreso y veo que no parpadea, pero tu código es demasiado elevado para mí (soy casi novato)... me explicas como hiciste para que no parpadee??
Gracias!! _________________ Saludos, Alpha. |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Lun 28 May, 2007 1:36 pm Asunto: |
|
|
Digamos que lo unico que hice fue copiar una imagen dentro del Canvas de TPanel, para que no se viera el parpadeo.
si te fijas, bien,
| Código: | this->ACanvas->TryLock();
this->ACanvas->Draw(this->PosBarra,1,this->Barra);
this->ACanvas->Unlock(); |
Uso esta opeacion, donde ACanvas es el Canvas del TPanel y dentro del copio la barra (this->Barra) que estoy creando lineas arriba _________________
 |
|
| Volver arriba |
|
 |
Alpha120 Lt


Registrado: 11 Mar 2007Mensajes: 99Ubicación: Sevilla, España
|
Publicado: Lun 28 May, 2007 2:50 pm Asunto: |
|
|
Me podrías poner un ejemplo de cómo copiar el canvas de un TImage a otro?? si puedes te lo agradecería mucho.
Gracias!! _________________ Saludos, Alpha. |
|
| Volver arriba |
|
 |
dobermannmx Master


Registrado: 30 Ago 2006Mensajes: 191Ubicación: Zapopan, Jal. - México
|
Publicado: Lun 28 May, 2007 5:04 pm Asunto: |
|
|
Alpha120, el secreto está en que utilices un TWinControl ya que tiene la propiedad "DoubleBuffered" que es la que evita los parpadeos, por eso César copia el Canvas a un TPanel (que es un TWinControl), pones la propiedad "DoubleBuffered" en TRUE y listo.
Salu2 _________________ ISC
Dobermannmx |
|
| Volver arriba |
|
 |
Alpha120 Lt


Registrado: 11 Mar 2007Mensajes: 99Ubicación: Sevilla, España
|
Publicado: Lun 28 May, 2007 5:06 pm Asunto: |
|
|
Pero sigo sin enterarme, dejarme un código de ejemplo porque no pillo como puedo hacer esa copia  _________________ Saludos, Alpha. |
|
| Volver arriba |
|
 |
dobermannmx Master


Registrado: 30 Ago 2006Mensajes: 191Ubicación: Zapopan, Jal. - México
|
Publicado: Lun 28 May, 2007 5:28 pm Asunto: |
|
|
El código de la copia ya lo escribió César, y para cambiar la propiedad del TPanel lo haces asi:
MiPanel -> DoubleBuffered = true;
y listo _________________ ISC
Dobermannmx |
|
| Volver arriba |
|
 |
Alpha120 Lt


Registrado: 11 Mar 2007Mensajes: 99Ubicación: Sevilla, España
|
Publicado: Lun 28 May, 2007 6:36 pm Asunto: |
|
|
Ya lo conseguí y parece ser que no era nada de eso.
Ya probando de todo, me di cuenta de la solución:
Simplemente puse la propiedad "Stretch" del TImage en "true" y ya no parpadea ni nada. Va genial! _________________ Saludos, Alpha. |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|