Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Go Back   Foros Club Delphi > Principal > Gráficos
Register FAQ Members List Calendar Guía de estilo Today's Posts

Reply
 
Thread Tools Search this Thread Display Modes
  #1  
Old 30/06/2004
senpiterno senpiterno is offline
Miembro
 
Join Date: Apr 2004
Posts: 112
Poder: 23
senpiterno Va por buen camino
Repintado de un objeto grafico

Hola amigos

Estoy trabajando con un PaintBox sobre el cual dibujo un texto en forma vertical creado con LOGFON y CreateFontIndirect, utilizando el canvas del objeto (en el hilo "orientacion del texto", esta explicado). Mi problema radica en que cada vez que el objeto se repinta se borra el texto creado sobre el, intente colocar la funcion que crea el texto en el evento onpaint del objeto, para que asi cada vez que se repintara el objeto se volviera a crear el texto, el cual efectivamente se vuelve a crear, pero perdiendo el efecto de vertivalidad perseguido. Esto mismo lo he realizado en VB, en el cual existe la propiedad AutoRedraw en los objetos graficos, propiedad que cualdo se coloca en true activa el redibujado automático de estos objetos, repintando imagenes y texto en la pantalla, en relacion a la imagen almacenada en memoria. El objeto no recibe eventos Paint; se vuelve a dibujar cuando es necesario, usando la imagen almacenada en memoria. Esto quiere decir que cuando se pinta algun texto o imagen en el objeto, este se vuelve a repintar con la imagen o el texto creado por nosotros y no con la apariencia original del objeto utilizado. Mi pregunta es ¿existe alguna propiedad en el canvas de los objetos graficos, como el PaintBox, que permita hacer lo mismo que el AutoRedraw en VB?.

De antemano gracias por cualquier ayuda.
Reply With Quote
  #2  
Old 30/06/2004
roman's Avatar
roman roman is offline
Moderador
 
Join Date: May 2003
Location: Ciudad de México
Posts: 20,269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¿En qué momento usas CreateFontIndirect? Yo supongo que debes usarlo en el evento OnPaint, es decir, cada vez que se requiere dibujar el texto.

// Saludos
Reply With Quote
  #3  
Old 30/06/2004
roman's Avatar
roman roman is offline
Moderador
 
Join Date: May 2003
Location: Ciudad de México
Posts: 20,269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Acabo de copiar el código que vic_ia te puso en el hilo http://www.clubdelphi.com/foros/showthread.php?t=11878 y lo pegué tal cuál en el evento OnPaint de un PaintBox y funcionó perfecto.

// Saludos
Reply With Quote
  #4  
Old 30/06/2004
vic_ia's Avatar
vic_ia vic_ia is offline
Miembro
 
Join Date: Jan 2004
Posts: 238
Poder: 23
vic_ia Va por buen camino
hola...

tal vez el problema radica que dibujas o asignas las propiedades del FONT antes de dibujar el resto de tu imagen o grafico, he probado colocar en el evento OnPaint del PaintBox el codigo de esta forma y funciona..

Código Delphi [-]
  PaintBox.Canvas.Brush.Color := clRed;  { cambio el color del brush }
  PaintBox.Canvas.RoundRect(0,0,150,150,7,10); { dibujo un rectangulo sobre el que coloco el texto }
  LOGFONT.lfHeight := 30;
  LOGFONT.lfWidth  := 10;
  LOGFONT.lfWeight := FW_NORMAL;
  LOGFONT.lfEscapement := 900; { angulo expresado en decimas de grado }
  LOGFONT.lfStrikeOut  := 0; { distinto de cero para activarlo }
  LOGFONT.lfItalic     := 0; { distinto de cero para activarlo }
  LOGFONT.lfUnderline  := 0; { distinto de cero para activarlo }
  LOGFONT.lfFaceName := 'Tahoma';

  Font := CreateFontIndirect(LOGFONT);
  SelectObject(PaintBox.Canvas.Handle,Font);
  PaintBox.Canvas.TextOut(100,100,Edit1.Text);
  DeleteObject(Font);

saludos...

Last edited by vic_ia : 30/06/2004 at 23:18.
Reply With Quote
  #5  
Old 30/06/2004
senpiterno senpiterno is offline
Miembro
 
Join Date: Apr 2004
Posts: 112
Poder: 23
senpiterno Va por buen camino
Desde el eveto onpaint llamo a la funcion que crea el texto vertical de esta forma:

Código Delphi [-]
procedure TFEntradaSistema.GradianPaint(Sender: TObject);
begin
   
    //Crea un gradian sobre el objeto PaintBox
    CreaGradian(FEntradaSistema.Gradian);
    
     //Donde gradian es el objeto PaintBox
    CreaTextoVertical(FEntradaSistema.Gradian,'Entrada');
end;

 
Function CreaTextoVertical(Objeto:TPaintBox;Texto:String):Boolean;
Var
  LOGFONT : TLogFont;
  Font    : HFONT;
Begin
  
Try //Iniciamos el codigo de control de errores
 
   Result:=False;//Asignamos el valor por defecto de la funcion
   
   Objeto.Canvas.Brush.Color := $00C0FFFF;
   LOGFONT.lfHeight := 15;
   LOGFONT.lfWidth  := 0;
   LOGFONT.lfWeight := FW_NORMAL;
   LOGFONT.lfEscapement := 900; { angulo expresado en decimas de grado }
   LOGFONT.lfStrikeOut  := 0; { distinto de cero para activarlo }
   LOGFONT.lfItalic     := 0; { distinto de cero para activarlo }
   LOGFONT.lfUnderline  := 0; { distinto de cero para activarlo }
   LOGFONT.lfFaceName := 'Tahoma';
   Font := CreateFontIndirect(LOGFONT);
   SelectObject(Objeto.Canvas.Handle,Font);
   Objeto.Canvas.TextOut(3,Objeto.Height - 10,'Entrada');
   
   Result:=True;//Le damos el valor de salida a la funcion
 
Except //Se ha producido un error
   On E:Exception Do
      If (MensajesDeError(ErroresSistema(E), E, MsgErrorCreaTextoVertical,False)<> Reintentar) Then Begin
          Result:=False; //enviamos la respuesta de error
      End;//If
   End;//on
End;//Function

Respecto al crear un rectangulo donde dibujar el texto no me sirve, ya que el efecto que pretendo dar con el texto vertical es crear primero un gradian sobre el objeto (PaintBox) y despues crear el texto en forma vertical, estilo barra de inicio de win. Por esto que la creacion de un rectangulo haria que el efecto que pretendo lograr no se viera bien.
Y les vuelvo a repetir cuando se genera el efecto onpaint en efecto del texto desaparece mostrandome el texto en forma horizontal y no vertical.
quizas puedo estar realizando algo mal...ademas para completar tambien les muestro el codigo utilizado para gererar el gradian:

Código Delphi [-]
 
Function CreaGradian(Objeto:TPaintBox):Boolean;
Var
     Row, Ht: Word ;
Begin
    Try //Iniciamos el codigo de control de errores
       
       Result:=False;//Asignamos el valor por defecto de la funcion
       
       Ht := (Objeto.ClientHeight + 255) div 256 ;
       For Row := 0 to 255 do Begin
           With Objeto.Canvas do begin
               Brush.Color := RGB(0, 0, Row+20) ;
               FillRect(Rect(0, Row * Ht, Objeto.ClientWidth, (Row + 1) * Ht));
           End;
       End;
       
       Objeto.Canvas.Refresh;
       
        Result:=True;//Le damos el valor de salida a la funcion
    
Except //Se ha producido un error
   On E:Exception Do
      If (MensajesDeError(ErroresSistema(E), E, MsgErrorCreaGradina,False)<> Reintentar) Then Begin
          Result:=False; //enviamos la respuesta de error
      End;//If
   End;//on
End;//Function
Reply With Quote
  #6  
Old 01/07/2004
vic_ia's Avatar
vic_ia vic_ia is offline
Miembro
 
Join Date: Jan 2004
Posts: 238
Poder: 23
vic_ia Va por buen camino
hola...

respecto a lo que muestras de tu codigo ...
Quote:
Originally Posted by senpiterno
Desde el eveto onpaint llamo a la funcion que crea el texto vertical de esta forma:

Código Delphi [-]
procedure TFEntradaSistema.GradianPaint(Sender: TObject);
begin
    //Crea un gradian sobre el objeto PaintBox
    CreaGradian(FEntradaSistema.Gradian);
     //Donde gradian es el objeto PaintBox
    CreaTextoVertical(FEntradaSistema.Gradian,'Entrada');
end;
Respecto al crear un rectangulo donde dibujar el texto no me sirve, .....

Código Delphi [-]
Function CreaGradian(Objeto:TPaintBox):Boolean;
Var
     Row, Ht: Word ;
Begin
    Try //Iniciamos el codigo de control de errores
       Result:=False;//Asignamos el valor por defecto de la funcion
       Ht := (Objeto.ClientHeight + 255) div 256 ;
       For Row := 0 to 255 do Begin
           With Objeto.Canvas do begin
               Brush.Color := RGB(0, 0, Row+20) ;
               FillRect(Rect(0, Row * Ht, Objeto.ClientWidth, (Row + 1) * Ht));
           End;
       End;
       Objeto.Canvas.Refresh;
        Result:=True;//Le damos el valor de salida a la funcion
Except //Se ha producido un error
   On E:Exception Do
      If (MensajesDeError(ErroresSistema(E), E, MsgErrorCreaGradina,False)<> Reintentar) Then Begin
          Result:=False; //enviamos la respuesta de error
      End;//If
   End;//on
End;//Function
creo que el enfoque que le has dado no es muy correcto (si alguien cree que esoy diciendo una tarugada, que me corrija por favor ) y pudieran ser dos las situaciones por las que se pierde la transformación del texto

quiero entender que el procedimiento GradianPain es el asignado al evento OnPaint de tu PaintBox, si es asi, esto hace que cada vez que pides que se dibuje (por algun evento, este cambia sus dimensiones varias veces, lo que posiblemente haga que otros objetos vuelvan a llamar a ese evento, y esto puede hacer que al solicitar la creación del font no tenga los recursos necesarios; por otro lado dentro del procedimiento llamas a Refresh lo que hara que se vuelva a solicitar el repintado, lo cual no necesariamente se hara de manera inmediata, tal vez esto ultimo sea lo que hace que se pierda la transformación...

yo cambiaria el enfoque, pienso que cada vez que cambias las dimensiones del control este llama a su evento OnPain, por lo que dentro de este solo debiera estar lo concerniente al dibujado interior del el, nada mas, creo que el cambio de las dimensiones lo debieras llevar a cabo desde.. no se por ejemplo desde donde lo llamas para que aparezca...

en cuanto tenga tiempo tratare de checarlo con detenimiento...

saludos...
Reply With Quote
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump


All times are GMT +2. The time now is 20:11.


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