Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-11-2004
Luli Luli is offline
Miembro
 
Registrado: oct 2004
Posts: 76
Poder: 20
Luli Va por buen camino
Lightbulb Selección de figuras

hola, me gustaria que me ayudaran con esto: En un programa tengo un área de dibujo y quiero saber como puedo seleccionar una figura que se ha pintado en ella, por ejemplo se pinta un circulo, entonces lo quiero seleccionar con un solo click sobre él, la seleccion debe verse como en paint, es decir, que al darle un click a la figura se vea seleccionada con cuatro cuadritos en las esquinas de un área que rodea la figura, no se si me estoy explicando, espero que si.

Bueno y una vez seleccionada, cuando le doy otro click me debe aparecer un formulario pidiendo datos, etc. Espero que me puedan ayudar, muchas gracias
Responder Con Cita
  #2  
Antiguo 30-11-2004
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.269
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Luli
...como puedo seleccionar una figura que se ha pintado en ella, por ejemplo se pinta un circulo, entonces lo quiero seleccionar con un solo click sobre él, la seleccion debe verse como en paint...
NOTA1: El Paint no selecciona una figura con un click sobre ella, aunque creo que he entendido la cuestión.

Creo que ya hablamos sobre ésto; Me la la impresión que para lo que quieres hacer el planteamiento no es correcto (si es que no he entendido mal);
Estás dibujando/pintando figuras sobre un área de dibujo, y creo que sería más adecuado que trabajaras con componentes (por ejemplo derivados de TShape); Eso te daría ya hecho mucho del trabajo que vas a tener que hacer a la hora de Dibujar, Seleccionar, Mover, Redimensionar, Grabar,... los objetos que tienes en el area de dibujo; Contando que muchas de esas operacines se realizan con el ratón (como la que comentas) el hecho de que sean objetos te da mucho trabajo hecho.

Tal vez me equivoque, pero si realmente estás pintando, creo que deberías hacer un "break" y plantearte hasta donde quieres llegar (si el final es hacer un programa similar al Paint, por ejemplo) y si el camino que llevas es el correcto, para no encontrarte más adelante con que "no puedes seguir".

Si estás trabaando con objetos y yo no lo he comprendido bien, dímelo, comentas con qué objetos trabajas y volvemos a la pregunta inicial.

Si estás pintando, la única forma de seleccionar "como en el Paint" es dibujando sobre el área de dibujo el recuadro y los puntos de selección, (PR1)para ello necesitas tener en algun sitio almacenados los elementos que has pintado con sus coordenadas y demás y calcular segun el punto de ratón (x,y) sobre qué figura has pulsado; (PR2)Si hay más de una figura en esa posición saber cual es la superior para saber a quien pintarle el recuadro;(PR3) Para eliminar el recuadro debes "borrarlo" y por lo tanto "repintar" los elementos a los que afecta,.... Éste es un poco el proceso lógico que yo veo, pero le encuentro muchas "lagunas/problemas(PRx)"; Sinceramente creo que no es el camino más adecuado.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 30-11-2004
Luli Luli is offline
Miembro
 
Registrado: oct 2004
Posts: 76
Poder: 20
Luli Va por buen camino
Lightbulb

Bueno, es verdad que tengo muchos problemitas con ésto, en realidad se trata de ésto: tengo que desarrollar un proyecto en el cual tengo que hacer varias figuras dentro de un area de dibujo y para ello he usado el objeto TCanvas, las figuras que manejo son la elipse, el rectangulo y rombo.
Las figuras las pinto al dar click sobre un boton que tiene indicado que va a dibujar tal o cual figura, bueno le doy click al boton y sobre mi area de dibujo doy click en algun lugar y se pinta la figura...

Codigo para dibujar una Elipse:
Image1.canvas.Ellipse(StartX,StartY,StartX+40,StartY+30);

Codigo para dibujar un rombo:
Image1.canvas.polyline([point(StartX,StartY),point(StartX+30,StartY+30),
point(StartX,StartY+60),point(StartX-30,StartY+30),point(StartX,StartY)]);


Codigo para un cuadrado:
Image1.canvas.polyline([point(StartX,StartY),point(StartX+60,StartY),point(StartX+90,StartY+40),point(StartX+30,StartY+40),
point(StartX,StartY)]);


Utilizo solo eso, en realidad no sé si con eso se pueda hacer lo de la selección y el movimiento de la figura sobre la pantalla como me comentaste, soy principiante en esto, creo que se nota mucho pero de verdad quiero aprender y me gustaria mucho que me pudieran ayudar, muchas gracias por el tiempo dedicado a responderme y en realidad en lo que me orienten me será de mucha utilidad...
Responder Con Cita
  #4  
Antiguo 01-12-2004
Luli Luli is offline
Miembro
 
Registrado: oct 2004
Posts: 76
Poder: 20
Luli Va por buen camino
Lightbulb mas información...

hola nuevamente, bueno he estado pensando mucho y me surgió otra duda, en cuanto al movimiento de las figuras, en realidad el proyecto pretende ser una herramienta para dibujar diagramas de flujo y hasta ahorita al darle click a un rectangulo por ejemplo, que es la figura de asignación, lo puedo pegar en cualquier parte del area de dibujo pero eso no se me hace funcional, lo que quiero es que la pueda pegar pero debajo de la figura anterior, es decir, si estoy empezando el diagrama, quiero pegar el rectangulo debajo de donde se encuentra la elipse de "inicio". Para esto tambien es la selección, para poder borrar la figura si ya no la quiero en donde la puse, ¿más o menos me explico? espero que si, bueno de antemano muchas gracias por la ayuda ...
Responder Con Cita
  #5  
Antiguo 01-12-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: 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
Difícilmente podrás hacer algo que no lleve de una u otra forma a la idea que te describió Neftali. Cuando dibujas algo en un canvas, éste no distingue las cosas que hayas puesto en el, él sólo "ve" un conjunto de pixeles. En este sentido es totalmente análogo a dibujar en un lienzo real; tú puedes dibujar una montaña pero ya no hay manera de moverla como no sea borrándola y volviéndola a dibujar.

Así pues, mi recomendación es que comiences a pensar en el hilo de ideas de Neftali.

Yo me enfrentaría a la tarea paso a paso. El primero de ellos posiblemente sea el poder determinar sobre qué objeto estás parado. Digamos que dibujas un rombo; en algún lugar guardas las coordenadas que hayas usado para dibujarlo. Cuando haces click en el canvas deberás tener una función del estilo de

Código Delphi [-]
function PuntoEnRombo(X, Y: Integer; parámetros): Boolean;

donde parámetros son los parámetros para dibujar el rombo en específico.

Windows maneja el concepto de regiones que quizá te sirva ya que al tiempo de dibujar un objeto puedes establecer una región similar y luego usar una de las funcones de la API de Windows como PtInRegion (o nombre similar) que te facilitarían la codificación de una función como la que te describo.

Después tendrás que manejar la lista de imágenes. Cada elemento de la lista debe contener la información necesaria para redibujar el objeto correspondiente. En el evento OnPaint o similar del canvas que uses deberás repasar la lista y dibujar cada uno de los objetos en ella representados.

Luego tendrás que meterte con el movimiento de los objetos. Como ya te indica Neftali, usarás una función que determine qué objeto estás tomando. Posiblemente aquí deberás crear un bitmap que copie la imagen correspondiente y usar algo como BitBlt de la API de Windows para ir moviendo el bitmap conforme se desplace el puntero del ratón. Al momento de soltarlo redibujas todo el canvas.

Claro que jamás he hecho algo así pero son las cosas que comenzaría a pensar, a reserva claro, de que en el camino me de cuenta de que hay errores de concepción. Pero por alguna parte se empieza.

// Saludos
Responder Con Cita
  #6  
Antiguo 01-12-2004
Luli Luli is offline
Miembro
 
Registrado: oct 2004
Posts: 76
Poder: 20
Luli Va por buen camino
Lightbulb

hola, todo lo que he leido me suena a que mejor me regreso, en realidad hubo un momento que decidí cambiar de proyecto porque me ofusqué pero en fin, a ver, entonces lo que entiendo es que lo recomendable es crear un componente con el que pueda hacer todo eso de arrastrar, pegar, seleccionar, etc. Bien, una pregunta más, por favor tengan un poco o mucho de paciencia conmigo, a ver, ¿donde puedo encontrar algo de información sobre lo que debo hacer? o por lo menos como lo busco... De verdad muchisimas gracias
Responder Con Cita
  #7  
Antiguo 01-12-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: 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
A ver mira. He estado viendo un poco y me aventuraría a traajar con regiones. De acuerdo al SDK de Windows una región es:

Cita:
Empezado por SDK de Windows
A region is a rectangle, polygon, or ellipse (or a combination of two or more of these shapes) that can be filled, painted, inverted, framed, and used to perform hit testing (testing for the cursor location).
Es decir, son figuras que puedes pintar, rellenar, etc. y determinar si el cursor está o no sobre una de ellas (perform hit testing).

Hay varias funciones para crear regiones. A ti te servirían:

CreateEllipticRgn
CreateRectRgn
CreatePolygonRgn (para el rombo)

Para pintar una región:

FillRgn o PaintRgn

Para mover una región:

OffsetRgn

Esta última mueve la posición lógica de la región más no directamente en el canvas.

Para saber si el cursor (o desde donde arrastres la figura) está en una región:

PtInRegion

Para dibujar las regiones usando FillRgn o PaintRgn especificas como parámetro HDC el Handle del Canvas que uses. Para las funciones que requieren un Brush me parece que te sirve el Canvas.Brush.

Cada una de las funciones Create...Rgn devuelven un handle a la región. Este handle es el que almacenarías en una lista. Cada vez que hagas cambios deberás recorrer dicha lista y usar FillRgn o PaintRgn para dibujar cada región en el Canvas.

Bueno, son sólo ideas. Si te interesa puedes consultar estos tópicos en la ayuda del SDK de Windows que viene con Delphi.

// Saludos
Responder Con Cita
  #8  
Antiguo 01-12-2004
Luli Luli is offline
Miembro
 
Registrado: oct 2004
Posts: 76
Poder: 20
Luli Va por buen camino
Lightbulb

hola muchas gracias por la ayuda de verdad. Voy a leer y analizar lo que me dices y a intentarlo nuevamente, si tengo alguna duda, (lo más seguro es que asi sea) lo consultaré por aqui, gracias nuevamente y estaremos en contacto...
Responder Con Cita
  #9  
Antiguo 01-12-2004
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.269
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Creo que lo más sencillo será un ejemplo, y a partir de ahí tendrás un poco más de idea de a lo que me refiero; Algo sencillo, pero que te puede dar idea de cual podría ser el funcionamiento de lo que estoy pensando.
También te puede servir para hacer pruebas; No se trata de trabajar con ésto.
Creo que deberías tener claro antes de seguir las "especificaciones" de tu programa; Tal vez las cosas que debes hacer te las pueda solventar de forma "mejor" uno de ellos.
Como ya te han comentado:
* Tipo de figuras con las que vas a trabajar.
* Operacioes generales que debes implementar: Almacenar el dibujo, recuperarlo,...
* Operaciones sobre el area de dibujo que debes realizar; Selección de un elemento, moverlo con el ratón, borrarlo, cambiarle el tamaño con el ratón,...
* Propiedades de los objetos que debes modificar, como posición, tamaño, colores, líneas,...

A continuación hay un pequeño ejemplo de crear objetos (TShape) y poder moverlos con el ratón. Crea un nuevo projecto, en el formulario crea un botón, copia en el PAS lo que hay a continuación y asignale al evento OnClick del boton la rutina Button1Click; Puedes crear diferentes elementos y arrastrarlos por el form.

Código Delphi [-]
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    Capturing:Boolean;
    MouseDownSpot:TPoint;
    NumFiguras:Integer;
    procedure _IMGMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure _IMGMouseUp(Sender: TObject; Button: TMouseButton;  Shift: TShiftState; X, Y: Integer);
    procedure _IMGMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
uses
  ExtCtrls;
procedure TForm1.Button1Click(Sender: TObject);
var
  Figura:TShape;
begin
  Randomize;
  // Crear un componentes
  Figura := TShape.Create(Self);
  Figura.Parent := Self;
  // Nombre
  Figura.Name := 'Elipse' + IntToStr(NumFiguras);
  // Posicion
  Figura.Top := 100 + (NumFiguras * 20);
  Figura.Left := 100 + (NumFiguras * 20);
  // Tamaño
  Figura.Height := 50;
  Figura.Width := 100;
  // Tipo de elemento
  Figura.Shape := TShapeType(Random(6));  // tipo de figura aleatorio
  NumFiguras := NumFiguras + 1;
  // Asignar para que pueda arrastrarse
  Figura.OnMouseMove := _IMGMouseMove;
  Figura.OnMouseDown := _IMGMouseDown;
  Figura.OnMouseUp := _IMGMouseUp;
  // Otras propiedades
  Figura.Cursor := crHandPoint;
  Figura.Brush.Color := RGB(Random(255), Random(255), Random(255));  // Color aleatorio
end;
procedure TForm1._IMGMouseDown(Sender: TObject; Button: TMouseButton;  Shift: TShiftState; X, Y: Integer);
begin
  Capturing := true;
  MouseDownSpot.X := x;
  MouseDownSpot.Y := Y;
end;
procedure TForm1._IMGMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  if Capturing then begin
    TWinControl(Sender).Left := TWinControl(Sender).Left - (MouseDownSpot.x - x);
    TWinControl(Sender).Top := TWinControl(Sender).Top - (MouseDownSpot.y - y);
  end;
end;
procedure TForm1._IMGMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if Capturing then begin
    ReleaseCapture;
    Capturing := false;
    TWinControl(Sender).Left := TWinControl(Sender).Left - (MouseDownSpot.x - x);
    TWinControl(Sender).Top := TWinControl(Sender).Top - (MouseDownSpot.y - y);
  end;
end;
end.

Si tienes dudas ya dirás...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
Respuesta



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


La franja horaria es GMT +2. Ahora son las 02:17:54.


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
Copyright 1996-2007 Club Delphi