• Domingo 22 de Diciembre de 2024, 13:32

Autor Tema:  Mostrar Una Parte De La Timagelist  (Leído 2760 veces)

Deiv

  • Miembro activo
  • **
  • Mensajes: 67
  • Nacionalidad: bo
    • Ver Perfil
Mostrar Una Parte De La Timagelist
« en: Lunes 16 de Octubre de 2006, 02:28 »
0
Hola,
Tengo una imágen de 128x640 pixels (donde se encuentra dibujado una Letra cada 64 pixels en 2 filas [10 letras encima y 10 letras abajo] c/64 pixels) que lo cargo con una TImageList (cual si fuera una matriz de 10x10), el código de abajo dibujándolo en un TPaintBox :
ImageList1.Draw(PaintBox1.Canvas,0,0,0)
me muestra el elemento [0,0] (primero de la fila 1); lo que intento es mostrar en este PaintBox el elemento [1,1] es decir por ejemplo, el SEGUNDO elemento de la Segunda Fila de mi imagen. No sé como realizarlo ya que el ImageList no tiene la propiedad TOP, entonces no avanzo.... ¿Existe alguna forma de reducir por código el tamaño de una TImageList o en su defecto del TPaintBox por encima para que me muestre los elementos de la parte inferior de mi Imagen?
Código: Text
  1. var
  2.   Bitmap: TBitmap;
  3. begin
  4.   Bitmap:= TBitmap.Create;
  5.   try  
  6.     BitMap.LoadFromFile(getcurrentdir+'/Doble.bmp');
  7.     ImageList1.Width:= Bitmap.Width div 10;
  8.     ImageList1.Height:= Bitmap.Height div 2;  //Le indico mostrar la primera fila
  9.     ImageList1.Masked:= FALSE;
  10.     ImageList1.Add(Bitmap,nil);
  11.   finally
  12.     Bitmap.Free;
  13.   end;
  14. end;
  15.  

Deiv

  • Miembro activo
  • **
  • Mensajes: 67
  • Nacionalidad: bo
    • Ver Perfil
Re: Mostrar Una Parte De La Timagelist
« Respuesta #1 en: Sábado 21 de Octubre de 2006, 18:55 »
0
Después de darle tanta vuelta al asunto he alcanzado responder a mi pregunta en un 90% creando un BitMap temporal, según el código de abajo, Cuando corro la aplicación y hago click en el primer botón funciona (me muestra un elemento de la primera fila), pero el segundo botón no me muestra nada!

De nuevo vuelvo a correr la aplicación y hago click pero esta vez en el segundo botón funciona (me muestra sí un elemento de la segunda fila) pero ahora el primer botón no me muestra nada!
¿A que se debe todo esto?
Código: Text
  1. implementation
  2.  
  3. var
  4.   Bitmap, tempBmp: TBitmap;
  5.   DestRect, SrcRect: TRect;
  6. {$R *.dfm}
  7.  
  8. procedure TForm1.Button1Click(Sender: TObject);
  9. begin  //tempBmp contiene la primera fila del Bitmap
  10.    tempBmp.Width := BitMap.Width;
  11.    tempBmp.Height := Bitmap.Height div 2;
  12.    DestRect := RECT(0,0,tempBmp.Width-1, tempBmp.Height-1);
  13.    SrcRect:=DestRect;
  14.    tempBmp.Canvas.CopyRect(DestRect, BitMap.Canvas, SrcRect);
  15.  
  16.    ImageList1.Width:= Bitmap.Width div 10;
  17.    ImageList1.Height:= tempBmp.Height;
  18.  
  19.    ImageList1.AddMasked(tempBmp, tempBmp.Canvas.Pixels[0,0]);
  20.    ImageList1.Draw(PaintBox1.Canvas,0,0,1);
  21. end;
  22.  
  23. procedure TForm1.Button2Click(Sender: TObject);
  24. begin //tempBmp contiene la segunda fila del Bitmap
  25.    tempBmp.Width := BitMap.Width;
  26.    tempBmp.Height := Bitmap.Height div 2;
  27.    DestRect := RECT(0,0,tempBmp.Width-1, tempBmp.Height-1);
  28.    SrcRect:=DestRect;
  29.  
  30.    SrcRect.Top := tempBmp.Height;
  31.    SrcRect.Bottom := Bitmap.Height-1;
  32.    tempBmp.Canvas.CopyRect(DestRect, BitMap.Canvas, SrcRect);
  33.  
  34.    ImageList1.Width:= Bitmap.Width div 10;
  35.    ImageList1.Height:= tempBmp.Height;
  36.  
  37.    ImageList1.AddMasked(tempBmp, tempBmp.Canvas.Pixels[0,0]);
  38.    ImageList1.Draw(PaintBox1.Canvas,0,0,2);
  39. end;
  40.  
  41. procedure TForm1.FormCreate(Sender: TObject);
  42. begin
  43.   Bitmap:= TBitmap.Create;
  44.   tempBmp:= TBitmap.Create;
  45.  
  46.   BitMap.LoadFromFile(getcurrentdir+'/Doble.BMP');
  47.   ImageList1.BkColor:=clNone;
  48.   ImageList1.BlendColor:= clNone;
  49.   ImageList1.DrawingStyle:= dsTransparent;
  50.   ImageList1.Masked:= True;
  51. end;
  52.  
  53. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  54. begin
  55.   Bitmap.Free;
  56.   tempBmp.Free;
  57. end;
  58.  
  59. procedure TForm1.Button3Click(Sender: TObject);
  60. begin
  61.   PaintBox1.Canvas.Fillrect(PaintBox1.Canvas.ClipRect); //Borra el Canvas
  62. end;
  63.  
  64. end.
  65.  
Luego para corregir este problema, he creado un tercer botón para el borrado del Canvas. En el código de arriba al hacer click en el primer botón dibuja bien, luego click en el tercer botón y borra el Canvas; pero cuando click en el segundo botón me vuelve a mostrar el mismo elemento de la primera fila, y no el elemento de la segunda fila.
¿Cómo corregir este problema? Por favor.

Deiv

  • Miembro activo
  • **
  • Mensajes: 67
  • Nacionalidad: bo
    • Ver Perfil
Re: Mostrar Una Parte De La Timagelist
« Respuesta #2 en: Lunes 6 de Noviembre de 2006, 20:44 »
0
Me parece que tengo un lío con el TPaintBox (y la neta verdad ya totalmente me confundí, ¿no se cuando darle una utilidad efectiva a un TPaintBox y cuando a una TIMage en Delphi?) por ello quise cambiar el código de abajo que con la ayuda de un Amigo me orientó para un TPaintBox necesito ahora para una TImage, y pensé que solo era cambiar (digamos en un botón)  de ImageList1.Draw(PaintBox1.Canvas,0,0,15)      a    ImageList1.Draw(Image1.Canvas,0,0,15) para mostrar ese pedazo [15]
Este código es para un TPaintBox:
Código: Text
  1. // Aqui dibujamos las imagenes en 2 filas y 9 columnas
  2. procedure TForm1.Button1Click(Sender: TObject);
  3. var
  4.   i,j: integer;
  5. begin
  6.   for i:= 0 to 9 do
  7.     for j:= 0 to 1 do
  8.       Imagelist1.Draw(PaintBox1.Canvas,i*50,j*50,i+(j*10));
  9. end;
  10.  
  11. procedure TForm1.FormCreate(Sender: TObject);
  12. var
  13.   Bitmap, Recorte: TBitmap;
  14. begin
  15.   Bitmap:= TBitmap.Create;
  16.   Recorte:= TBitmap.Create;
  17.   try
  18.     Bitmap.LoadFromFile('d:\dibujo.bmp');
  19.     ImageList1.Clear;
  20.     ImageList1.Width:= Bitmap.Width div 10;
  21.     ImageList1.Height:= Bitmap.Height div 2;
  22.     Recorte.Width:= Bitmap.Width;
  23.     Recorte.Height:= Bitmap.Height div 2;
  24.     Recorte.Canvas.CopyRect(Recorte.Canvas.ClipRect,
  25.       Bitmap.Canvas,Rect(0,0,Bitmap.Width,Bitmap.Height div 2));
  26.     Imagelist1.AddMasked(Recorte, Recorte.Canvas.Pixels[0,0]);
  27.     Recorte.Canvas.CopyRect(Recorte.Canvas.ClipRect,
  28.       Bitmap.Canvas,Rect(0,Bitmap.Height div 2,Bitmap.Width,Bitmap.Height));
  29.     Imagelist1.AddMasked(Recorte, Recorte.Canvas.Pixels[0,0]);
  30.   finally
  31.     Bitmap.Free;
  32.     Recorte.Free;
  33.   end;
  34. end;
  35.  

Si bien el código no tiene error, me nacieron las siguientes dudas:

a) ¿Como transparentar en el TImage mi BitMap de la TImageList?, pues intenté colocando con las líneas:
Código: Text
  1.     ImageList1.BkColor:=clNone;
  2.     ImageList1.BlendColor:= clNone;
  3.     ImageList1.DrawingStyle:= dsTransparent;
  4.     ImageList1.Masked:= True;
  5.  
   y NO TUVE ÉXITO

   Lo propio con:
Código: Text
  1.     Image1.Transparent:=true;
  2.     BitMap.TransparentColor:=BitMap.Canvas.Pixels[0,0];  //Tiene fondo blanco
  3.     BitMap.Transparent:= True;
  4.     BitMap.TransparentMode:= tmFixed;
  5.  
   TAMPOCO

b.)¿Qué diferencia hay si coloco BitMap.TransparentColor:=BitMap.Canvas.Pixels[1,1];?
   Así parece que no transparenta cuando intenté en otra Aplicación de prueba cargando solo una imagen y transparentando como mencioné arriba y nada, pero con [0,0] si funcionaba.

Bueno en fin: entonces a la hora de dibujar ¿Cómo muestro digamos el índice 15 TRANSPARENTADO del TImageList en una TImage?

En resumen necesito traducir este mismo código a una TImage pero que me muestre ese trozo de la TIMageLIst transparentado en una TImage