Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-04-2008
fasthorse fasthorse is offline
Miembro
 
Registrado: ene 2007
Posts: 90
Poder: 18
fasthorse Va por buen camino
Estoy mirando a ver si puede ser con unas opciones del TShape que son onDragOver y onDragDrop que son de arrastrar y soltar, pero no me hacen nada... y con respecto a lo de la redimensión no se aún cómo hacerlo.
Aunque alguna forma habrá no?

Saludos.
Responder Con Cita
  #2  
Antiguo 03-04-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Cita:
Empezado por fasthorse Ver Mensaje
Aunque alguna forma habrá no?
Debes usar el evento OnMouseDown, OnMouseUp y OnMouseMove tanto de la TImage como del TShape para controlar la seleccion.

En el OnMouseDown defines el Left y Top del TShape, y en el OnMouseMove defines el Right, Button del mismo hasta que sea llamado el evento OnMouseUp; ésto te dará el efecto necesario.

Saludos
Responder Con Cita
  #3  
Antiguo 03-04-2008
fasthorse fasthorse is offline
Miembro
 
Registrado: ene 2007
Posts: 90
Poder: 18
fasthorse Va por buen camino
Hola, me podrías poner por favor, un ejemplo del uso de los eventos OnMouseDown, OnMouseUp y OnMouseMove, y cómo dentro de ellos les indico el valor de Letf, top...? No se muy bien cómo hacerlos.

Gracias, saludos.
Responder Con Cita
  #4  
Antiguo 03-04-2008
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.557
Poder: 25
egostar Va camino a la fama
Cita:
Empezado por fasthorse Ver Mensaje
Hola, me podrías poner por favor, un ejemplo del uso de los eventos OnMouseDown, OnMouseUp y OnMouseMove, y cómo dentro de ellos les indico el valor de Letf, top...? No se muy bien cómo hacerlos.

Gracias, saludos.
Hola fasthorse, para estos casos lo mejor es usar la famosisima tecla F1 y ver los ejemplos que te proporciona.

Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #5  
Antiguo 04-04-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Hace cuatro semanas iniciaste este mismo tema. Recuerda esto:
Cita:
Empezado por escafandra Ver Mensaje
Investiga esto:
Canvas->Rectangle y InvalidateRect http://msdn2.microsoft.com/en-us/library/ms534893.aspx
Utiliza también el evento OnMouseMove y OnMouseClick para mover y cambiar el tamaño de tu rectángulo.
Utiliza eventos de teclado para controlar acciones de las teclas Control y Alt.

Saludos.
Canvas->Rectangle dibuja un rectángulo en dicho canvas, sin necesidad de utilizar componentes visuales como TShape. Puedes dibujarlo en línea contínua, puntitos... InvalidateRect te sirva para repintar el área original cada vez que muevas o modifiques tu rectángulo selector.

Para que invalidateRect funcione mejor, haz una llamada por cada lado del rectángulo, de esa forma el área de éste no se repinta entera y el efecto visual es mejor.

Evidentemente el control de ese rectángulo, lo haces con el ratón con los eventos descritos.

Crea una variable o b¡miembro de la clase que almacene el TRect "selector" para que los eventos del ratón la modifiquen según su movimiento (OnMouseMove y OnMouseClick).

Investiga la ayuda de Builder.
Responder Con Cita
  #6  
Antiguo 05-04-2008
fasthorse fasthorse is offline
Miembro
 
Registrado: ene 2007
Posts: 90
Poder: 18
fasthorse Va por buen camino
Ok, hago dibujando con el Canvas, en vez de utilizar un Tshape como me dices, pero ahora resulta que en la ejecución me dice : "can only modify an image if it contain a bitmap". la tendría que convertir a Bitmap para poder manipularla? si el caso es afirmativo, como seria?

Gracias.
Responder Con Cita
  #7  
Antiguo 05-04-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Pues ahora no entiendo muy bien lo que quieres hacer. Lo que te propuse era dibujar un rectángulo que representa el área seleccionada. Esto es lo que entendí que querías hacer. Modificar el tamaño de ese rectángulo, moverlo... Para al terminar, tener unas coordenadas en un TRect que posteriormente usarías para copiar parte de la imagen.

Si lo que pretendes es modificar directamente la imagen, en tiempo real al mover el ratón, la cosa cambia.

No se como has dibujado en el canvas.

Si tratas de dibujar en un control al que no tienea acceso a su canvas, pues haces lo siguente:



Código:
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
   // Si tratas de dibujar en un control al que no tienea acceso a su canvas, pues haces lo siguente:
   // En la definición de TForm1 defines  TControlCanvas*   Canvas; //Sobrecargado...
   // En el Constructor:
   // Canvas = new TControlCanvas;
   // Canvas->Control = this;

    Canvas->Pen->Mode = pmNot;
    Canvas->Pen->Style = psDot;
    Canvas->Pen->Width = 1;
    Canvas->Brush->Style = bsClear; //bsDiagCross;
 
    // Variable con la selección TRect SelectRect;
    SelectRect = TRect(0,0,0,0);    
}

//---------------------------------------------------------------------------
__fastcall TForm1::~TForm1(TComponent* Owner)
   : TForm(Owner)
{
   // Si tratas de dibujar en un control al que no tienea acceso a su canvas, pues haces lo siguente:
    // delete Canvas;

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   SelectRect = TRect(100,100,200,200);

   Canvas->Rectangle(SelectRect);
}
Cada vez que modificas el rectángulo, lo tienes que borrar y repintar. Para borrar: InvalidateRect.

Una forma de agilizar el tema, si el efecto visual de repintar el área del rectángulo no te gusta sería escribir otra función que sólo borre los lados del rectángulo:

Código:
void InvalidateFrameRect(TWinControl *Control, TCanvas *Canvas, TRect Rect)
{
   int H = Canvas->Pen->Width/2 + 1;

   // Normalizamos el TRect
   Rect = TRect(min(Rect.Left, Rect.Right), min(Rect.Top, Rect.Bottom),
                max(Rect.Left, Rect.Right), max(Rect.Top, Rect.Bottom));
  
   TRect R(Rect.Left-H, Rect.Top-H, Rect.Right+H, Rect.Top+H);
   InvalidateRect(Control->Handle, &R, true);
   R = TRect(Rect.Left-H, Rect.Bottom-H, Rect.Right+H, Rect.Bottom+H);
   InvalidateRect(Control->Handle, &R, true);
   R = TRect(Rect.Left-H, Rect.Top-H, Rect.Left+H, Rect.Bottom+H);
   InvalidateRect(Control->Handle, &R, true);
   R = TRect(Rect.Right-H, Rect.Top-H, Rect.Right+H, Rect.Bottom+H);
   InvalidateRect(Control->Handle, &R, true);


   Control->Perform(WM_PAINT, (int)Canvas->Handle, 0);
   Control->Update();
}
LLevas una variable de la clase TForm (o la que sea) que sea un TRect con las coordenadas de tu selección que son a su vez la de tu rectángulo selecionador...
El resto lo haces con los eventos del ratón (OnMouseDown, OnMouseUp y OnMouseMove) a los que puedes añadir modificadores con el teclado (TShiftState) o lo que necesites.

Si prefieres hacerlo con un TShape, pues también te sirve, como bien te indicó cHackAll.

Espero que te sirva de ayuda.

Saludos.



EDITO 2:
Corrijo un pequeño fallo, se debe normalizar el TRect.

Te muestro un ejemplo: Archivo Adjunto 1220

Última edición por escafandra fecha: 21-05-2008 a las 12:09:51.
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Selección en Excel Jordy Servers 1 06-12-2005 08:55:00
Selección de figuras Luli Gráficos 8 01-12-2004 11:08:49
seleccion dbgrid davidgaldo Conexión con bases de datos 3 26-02-2004 09:45:33
Seleccion en DBLookUpComboBox NuncaMas Varios 1 22-12-2003 18:41:21
una seleccion YolandaM Impresión 2 04-10-2003 20:11:59


La franja horaria es GMT +2. Ahora son las 10:10:12.


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