Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Gráficos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-10-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 22
cHackAll Va por buen camino
Código Delphi [-]
unit Unit1; // Ejemplo de buffer doble programada, no interesa el valor de la propiedad...
 
interface
 
uses Windows, Classes, Graphics, Controls, Forms, ExtCtrls;
 
type
 TForm1 = class(TForm)
  Timer: TTimer;
  procedure FormCreate(Sender: TObject);
  procedure FormPaint(Sender: TObject);
  procedure TimerTimer(Sender: TObject);
  procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  procedure FormDestroy(Sender: TObject);
 end;
 
var Form1: TForm1;
 
implementation
 
{$r *.dfm}
 
var
 Bitmap: TBitmap;
 Value: Integer;
 Flag: Boolean;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
 Bitmap := TBitmap.Create;
 Bitmap.Width := ClientWidth;
 Bitmap.Height := ClientHeight;
 Bitmap.Canvas.Pen.Color := clRed;
 Timer.Interval := 20;
end;
 
procedure TForm1.FormPaint(Sender: TObject);
begin
 BitBlt(Canvas.Handle, 0, 0, ClientWidth, ClientHeight, Bitmap.Canvas.Handle, 0, 0, SRCCOPY); // Double buffered !
end;
 
procedure TForm1.TimerTimer(Sender: TObject);
begin
 if not Flag then
  if Value = 120 then
   Flag := not Flag
  else
   Inc(Value, 6)
 else
  if Value = 0 then
   Flag := not Flag
  else
   Dec(Value, 6);
 FormMouseMove(nil, [], 0, 0);
end;
 
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
 Point: TPoint;
 Size: Integer;
begin
 with Bitmap.Canvas do
  begin
   Lock;
 
   Size := Value - 100;
   GetCursorPos(Point);
   if Size < 0 then Size := 0;
   Y := Point.Y - Top - (66 * 2) + (Value - Size);
   X := Point.X - Left;
 
   Brush.Color := clBlack;
   FillRect(ClientRect);
   Pen.Color := clRed;
   Brush.Color := Pen.Color;
   Ellipse(X - 66, Y - (66 * 2) + Size, X + 66, Y);
   Y := Point.Y - ClientOrigin.Y;
   Pen.Color := 150 + Size * 5;
   Rectangle(X - 66, Y, X + 66, Y + 2);

   FormPaint(nil);
   Unlock;
  end;
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
 Bitmap.Destroy;
end;
 
end.
__________________
RTFM > STFW > Foro > Truco > Post > cHackAll > KeBugCheckEx
Responder Con Cita
  #2  
Antiguo 07-10-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Muy chulo pero si la form tuviese algun componente y no solo un bitmap que se pintase todo en ella...con el doublebuffered de la form se evitaria flickering al pintar todo de un mismo golpe no? me refiero...es redundante o no el uso de doublebuffered en todos los componentes con posible retardo a pintar? Bueno, para el caso, mas o menos lo mismo.

Última edición por coso fecha: 07-10-2008 a las 19:36:10.
Responder Con Cita
  #3  
Antiguo 07-10-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 22
cHackAll Va por buen camino
A que te refieres coso? pues el ejemplo funciona con N componentes "encima" sin ningun efecto "flickering"

PD; al utilizar la propiedad DoubleBuffered perteneciente a TWinControl se crea en cada proceso de repintado, un nuevo canvas y bitmap internamente y se hace uso de una llamada recursiva a WMPaint con lo que en procesos complejos con GDI se nota una carga extra al procesador.

Tambien me parece que seria un "juego" algo "feo" si tuviese un TButton al centro del formulario (por ejemplo).

Saludos
__________________
RTFM > STFW > Foro > Truco > Post > cHackAll > KeBugCheckEx
Responder Con Cita
  #4  
Antiguo 07-10-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
no no tu ejemplo perfecto, pero si el bitmap no se copiase a toda la form, entonces todo el resto (si estuviese doublebuffered a false) se dibujaria directamente a pantalla no? entonces, vamos, para una form con un dibujo mejor crear un unico bitmap de toda la form (esto es doublebuffered a true de la form). Me refiero, q si TBitmap esta con dblbuffer y la form no, el trozo de form visible se dibujaria directamente a pantalla mientras q de TBitmap se haria el dibujo a memoria y luego volcado, o sea, dos pasos, mientras q si la form esta a doublebuffer solo se haria un unico bitmap total en memoria de todo lo que se tiene q mostrar y luego, volcado (espero haberme explicado, aqui es tarde ). Venga saludos.
Responder Con Cita
  #5  
Antiguo 08-10-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 22
cHackAll Va por buen camino
Cita:
Empezado por coso Ver Mensaje
no no tu ejemplo perfecto, pero si el bitmap no se copiase a toda la form, entonces todo el resto (si estuviese doublebuffered a false) se dibujaria directamente a pantalla no? entonces, vamos, para una form con un dibujo mejor crear un unico bitmap de toda la form (esto es doublebuffered a true de la form). Me refiero, q si TBitmap esta con dblbuffer y la form no, el trozo de form visible se dibujaria directamente a pantalla mientras q de TBitmap se haria el dibujo a memoria y luego volcado, o sea, dos pasos, mientras q si la form esta a doublebuffer solo se haria un unico bitmap total en memoria de todo lo que se tiene q mostrar y luego, volcado (espero haberme explicado, aqui es tarde ). Venga saludos.
Entonces dejando de lado el ejemplo que puse; explicame lo que quieres decir una vez mas... te prometo que ahora si lo entendere
__________________
RTFM > STFW > Foro > Truco > Post > cHackAll > KeBugCheckEx
Responder Con Cita
  #6  
Antiguo 08-10-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
1.- Form1.doublebuffered := true; TBitmap.doublebuffered := true -> 1 unico bitmap creado en memoria (de toda la form + TBitmap) y volcado a pantalla.

2.- Form1.doublebuffered := false;TBitmap.doublebuffered := true; -> TBitmap se dibuja en memoria y se vuelca a su zona correspondiente de pantalla, Form1 (excepto el trozo de TBitmap) se dibuja directamente en pantalla. Hay posibilidad de flickering segun como sea Form1 (si tarda mucho en dibujarse, habra retardo entre repintados)

(1) es mejor; los dos doublebuffered, no son redundantes (como mucho, el de TBitmap). saludos.
Responder Con Cita
  #7  
Antiguo 08-10-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
(*) donde pone TBitmap, lee TImage. Es la TImage donde se mueven las fichas del principio...saludos.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Dibujando líneas en Canvas JAV Gráficos 1 27-09-2007 15:56:05
Dibujando en un TListView pepon386 Gráficos 1 20-01-2006 09:36:28
Dibujando en capas blueicaro Gráficos 1 26-04-2005 09:46:02
Canvas does not allow drawing MADV01 Impresión 1 02-04-2004 15:08:43
Canvas???? craven Gráficos 2 17-05-2003 13:26:02


La franja horaria es GMT +2. Ahora son las 02:53:00.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi