Ver Mensaje Individual
  #14  
Antiguo 05-04-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Reputación: 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