Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Superpocision de imagen en Image.Canvas (https://www.clubdelphi.com/foros/showthread.php?t=62001)

pablopessoa 30-11-2008 17:59:34

Superpocision de imagen en Image.Canvas
 
Hola gente!!
tengo un problema dibujando en el canvas de un Timage.
Supongamos que hago un rectangulo con borde negro y relleno (Brush) de color verde, ahora hago otro igual pero el nuevo rectangulo se situa en poco encima del primero, bueno la parte donde se "mezclan" en lugar de quedarse de color verde.. se pone de color blanco.
Como puedo arreglar esto? ahora los pongo un ejemplo.

cHackAll 30-11-2008 18:27:51

:eek: prueba;

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
 Canvas.Pen.Width := 2;
 Canvas.Pen.Color := clBlack;
 Canvas.Brush.Color := clGreen;
 Canvas.Rectangle(100, 100, 200, 200);
 Canvas.Rectangle(150, 150, 250, 250);
end;

Talvez si nos copias (parte de) tu codigo podriamos saber que sucede :rolleyes:

pablopessoa 30-11-2008 18:35:40

no hay problema, aca te subo el codigo del editor grafico para que lo veas como trabaja, ( y tb por si te sirve ;)) , capas puedas ver como hacer que no me pinte de blanco las figuras ( ojo , depende los colores, si superpongo una cuadrado azul con uno amarillo me aparece verde jeje).
saludos y gracias por el interes

seoane 30-11-2008 18:43:56

¿Para que usas esta linea?
Código Delphi [-]
Pen.Mode := pmNotXor;

pablopessoa 01-12-2008 02:12:19

Mirá, la uso por que asi lo encontre en un tutorial, lo probe y funciono, pero ahora que me lo pregunte busque un poquito mas y encontre este texto en una web : (es un poquito largo, perdon por eso)

"...De todos los modos de dibujo, el más socorrido y el que vamos a usar es el pmNotXor. Este modo tiene la particularidad que si dibujamos una línea, por ejemplo, y después vuelves a dibujar la línea de nuevo por encima de la que estaba, esta se borra, y queda como si no hubieras dibujada nada.Esto lo vamos a usar para crear el efecto que tienen los programas de dibujo, los cuales cuando dibujas un línea esta se se va dibujando a medida que mueves el ratón, y puedes ir cambiando el destino, y cuando dejas de dibujar (sueltas el botón por ejemplo), la línea queda dibujada desde el origen hasta donde esta el cursor del ratón...."

Vos decis que el problema esta en usar ese modo del Pen.Mode ? a cual me recomendarias que cambie? Gracias!!!

pcicom 01-12-2008 02:18:33

Prueba con esto

Asignale a la imagen o al objeto EN CANVAS lo siguiente

imagen1.Canvas.brush.Style:=bsClear;

pablopessoa 01-12-2008 02:36:53

segui investigando un poco mas sobre los modos del pen, y resulta que, como yo doy la opcion de elegir un color de relleno a la figura, el modo pmNotXor es el unico que me permite dibujar la figura con el color de relleno elegido.
si pongo otro modo no me dibuja el relleno como yo quiero , y poner brush.style:=bsclear hace que no tome el color de relleno, osea, me dibuja la figura sin color de relleno.
El problema es que el modo pmNotXor, hace que si dibujo por ensima de otra figura, borre lo que estaba "abajo". Probe con todos los modos y con ninguno logro que dibuje la figura con el color de linea y relleno que yo elijo y que si dibujo por ensima de otra figura, la nueva figura quede "ensima" de la anterior pisandola, es decir, sin que se anule la parte superpuesta....
Les Agradesco la ayuda, voy a seguir probando y si alguno encuentra una solucion se lo agradeceria
Saludos!!!!

Lepe 01-12-2008 06:22:49

Ahora comprendo la cara de asombro de cHackAll :D, yo también me quedé a cuadros :D

Código Delphi [-]
Procedure TForm1.Cuadrado (Const X,Y :integer);
Begin
  With Canvas Do
  Begin
    Pen.Mode := pmCopy;
    MoveTo (Origen.X,Origen.Y);
    Rectangle (Origen.X,Origen.Y,Punto.X,Punto.Y);
    MoveTo (Origen.X,Origen.Y);
    Rectangle (Origen.X,Origen.Y,X,Y);
  end; //Final del With Image1.Canvas
end;


procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
If Button = mbLeft Then
      Begin
          Pintando := True;
          Canvas.MoveTo (X,Y);
          Origen.X := X;
          Origen.Y := Y;
      end;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
If Pintando Then
  begin
    Punto := Point (X,Y);
    ultimo := Point(x,y);
    BorrarUltimo := True;
    Canvas.Pen.Style := psDot;
    Canvas.Pen.Mode := pmCopy;
    Canvas.Rectangle(Origen.x, Origen.Y,x,y);

  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Pintando := False;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
If Button = mbLeft Then
  Begin
    Pintando := False;
    Canvas.pen.style := pssolid;
    Canvas.Rectangle(Origen.x, Origen.Y, ultimo.x, ultimo.Y);
    Cuadrado(x,y);
  end;
end;
El modo pmNotXor lo que hace básicamente es invertir el color que haya en ese punto, con sus detalles y demás.... pero básicamente eso.

Lo que necesitas es usar pmCopy que será el que te pinta encima de otras piezas.

Tendrás que adaptarlo, ya que al incluir sólo la unidad tuve que copiar y pegar a una aplicación de prueba.

Tiene algunos fallitos, pero eso ya te lo dejo a ti.

pablopessoa 01-12-2008 23:29:35

1 Archivos Adjunto(s)
Te agradezo la respuesta y la molestia que te tomaste, pero usar pmCopy, si bien "pisa" la imagen tiene un problema, supongamos que hago el rectangulo, pero no suelto el mouse, si vuelvo para atras (es decir, "giro" el mouse) el rectangulo se llena de rayitas, adjunto una imagen por si no se entiende lo que digo

Lepe 02-12-2008 15:14:32

claro, ese es el "fallito que te lo dejaba a tí" :p

Cuando se mueve el mouse, debes guardar la posición en la que se ha dibujado el cuadrado de rayitas (el que marca la selección) y usar pen xor o NotXor para borrar el cuadro anterior. Lo que te ocurre es igualito a cuando terminas una partida del solitario de windows :p

La filosofía es simple:
- Primero dibujas en modo pmcopy y dsdot para crear el cuadro
- al mover el ratón hacia atrás, debes borrar el cuadro anterior, y eso se consigue pintando de nuevo en las coordenadas del antiguo cuadro con el modo NotXor y dsdot.

Dicho de otra forma: borrar un cuadro es pintar con xor activado.

Edito: las imágenes, puedes subirlas a www.imageshack.us por ejemplo y poner el link aquí.

Saludos

cHackAll 02-12-2008 17:23:53

1 Archivos Adjunto(s)
:eek: :rolleyes:

Lepe 02-12-2008 19:11:38

Cita:

Empezado por cHackAll (Mensaje 329153)
:eek: :rolleyes:

eso es trampa :mad::(:o;):p

pablopessoa 02-12-2008 20:43:03

Gracias por el ejemplo! es justo lo que necesitaba, voy a adaptarlo a mi aplicacion!
Muchas Gracias!


La franja horaria es GMT +2. Ahora son las 05:24:27.

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