Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Dibujar en delphi (https://www.clubdelphi.com/foros/showthread.php?t=19394)

Noitam 13-03-2005 09:01:09

Dibujar en delphi
 
bueno, escribo aqui en busca de ayuda para hacer un pain en delphi y principalmente esa es la idea
de momento e intentado dibujar una linea en un image o un paintbox, lo e conseguido, pero la idea es que la linea se dibuje con forme arrastre el cursor y quede como definitiva cuando lo suelte.
una cosa que observe, es que el evento onmouseup se activa al soltar cualqueir boton y necesito saber que boton se solto para que no me dibuje lineas con el otro boton del mause xD
si alguien me puede ayudar, me haria un gran favor
Noitam

Neftali [Germán.Estévez] 14-03-2005 09:41:15

Bueno, no es complicado, se trata de jugar con los eventos del Mouse.
Define en la parte privada un par de variables como éstas:

Código Delphi [-]
     _Painting:Boolean;  // Para marcar cuando estamos pintando
     _origen:TPoint;      // punto origen de la línea

Y en los eventos del Mouse del PintBox lo siguiente:

Código Delphi [-]
 procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
   Shift: TShiftState; X, Y: Integer);
 begin
 
   _Painting := True;
   _origen.X := x;
   _origen.Y := Y;
 
 end;
 
 procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
   Shift: TShiftState; X, Y: Integer);
 begin
   _Painting:= False;
 
   PaintBox1.Canvas.Pen.Width := 2;
   PaintBox1.Canvas.Pen.Color := clRed;
   PaintBox1.Canvas.MoveTo(_origen.X, _origen.Y);    (*1*)
   PaintBox1.Canvas.LineTo(x,y);                (*1*)
 
 end;
 
 procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,  Y: Integer);
 begin
   // Si se debe pintar...
   if _Painting then begin
     // Borrar
     PaintBox1.Canvas.FillRect(Self.PaintBox1.ClientRect);
     // pintar
     PaintBox1.Canvas.Pen.Color := clRed;
     Canvas.Polyline([Point(_origen.X, _origen.Y), Point(x,y)]);   (*2*)
   end;
 end;

Para distinguir entre un botón y otro del mouse, verás que exixte un parámetro Button: TMouseButton que te da esa información.

darkerbyte 16-03-2005 02:44:56

Otra idea
 
Yo hice un programa parecido al corel draw o al ilustrator, pero las tecnicas de dibujo son las mismas. Por que no utilizas mejor 2 Timage, uno encima de otro, el primero definelo como transparente. y utiliza las rutinas que ya te proporcionaron en la respuesta anterior, en el evento onmousedow guarda el punto de origen, en el evento onmousemove limpia el timage y traza una linea del punto original a la posiciòn del mouse, en el evento onmouseup guarda el segundo punto, ya teniendo ambos puntos , coloca el punto activo del pixel del cavans en el punto 1 y luego usa el procedimiento lineto(x,y) al punto dos

Pronto subire el programa que hice con el codigo a mi pagina, cuando lo haga te aviso.

:confused: Perdona pero no tengo el codigo a la mano, asi que no recuerdo el nombre correcto de las rutinas.

soloriv 17-04-2006 17:31:36

Hola a todos
Segui este hilo y mi consulta es como hacer lo mismo pero con un jpeg dado que me da como error no es un bmp, si es posible, si no tendre que convertir.
Y la otra duda es que siendo bmp la imagen en un image o paintbox al arrastrar el mouse la imagen se pierde completamente y se vuelve un cuadro blanco. Necesitaria crear un bitmap para que esto no ocurra o como lo solucionaria.
Saludos y Gracias Soloriv.

pattyka 19-07-2006 00:51:43

como dibujar un circulo con los eventos del mouse en paintbox como se hace???... porfavor ;)

Neftali [Germán.Estévez] 19-07-2006 10:26:41

Cita:

Empezado por pattyka
como dibujar un circulo con los eventos del mouse en paintbox como se hace???

Hola.
Antes de nada te recomiendo que revises la Guia de estilo.

Para dibujar un circulo/Elipse utilizando el código que hay arriba, puedes cambiar las dos líneas dode aparece (*1*) por éste código:

Código Delphi [-]
  PaintBox1.Canvas.Ellipse(_origen.X, _origen.Y, x,y);

Y la línea donde pone (*2*) por esta:

Código Delphi [-]
Canvas.Ellipse(_origen.X, _origen.Y, x,y);

jorllazo 26-09-2006 08:41:30

Vale... Ahora, a ver si esto es posible con el paintBox o con cualquier otro control.
dispongo de una Tree View en la que guardo todos los cuadrados, circulos que pinto dentro del paint box Ej

Dibujo1
|
|-- Cuadro 1
|-- Cuadro 2

Etc.... como se puede hacer para que Seleccionando Cuadro1 o Cuadro 2 por ejemplo cambie de color en la PaintBox? es Decir saber que elemento del dibujo se ha seleccionado.

Neftali [Germán.Estévez] 26-09-2006 10:51:39

Si estás pensando en este tipo de operaciones, la técnica de pintar directamente sobre un paintBox (o similar) tal vez no sea la más adecuada; Debería revisar éste control (TSimpleGraph); Es especial para éste tipo de cosas.

jorllazo 26-09-2006 11:16:28

MMmm...
creo que no me sirve ese control.

Posiblemente tuviera que redibujar la pantalla y cambiar el relleno de la forma en particular. por que tengo sus coordenadas, pero al reves?, me refiero pinchando en la forma en particular, que me dijera cual es?

Neftali [Germán.Estévez] 26-09-2006 12:02:59

Cita:

Empezado por jorllazo
creo que no me sirve ese control.

¿Porque no? No lo entiendo
El problema de dibujar directamente sobre el canvas, es que lo que dibujas no es un objeto en sí, sino pixels de colores. Si quieres seleccionar, modificar, mover,... los objetos que dibujas, deben ser objetos como tal y no pixels pintados. No se si me explico.
Sea con este componente, con otro, o manualmente debes guardar la información completa de lo que estás dibujando, poder seleccionarlo y redibujar cuando cambias algo. Puedes hacerlo "a mano", pero este componente ya lo tiene implementado.

jorllazo 26-09-2006 12:06:04

Puede que si me funcione, el caso es que lo probare...
Sucede que si te encabezonas con la idea inicial que llevas..
ver a ver si tiene aplicacion...

Gracias.


La franja horaria es GMT +2. Ahora son las 00:50:01.

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