Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Dibujar un cuadrado sobre el canvas..novata

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Dibujar un cuadrado sobre el canvas..novata Responder citando

Hola,

Necesito seleccionar una zona de un Image con el mouse, algo asi como enmarcarla con un recuadro que se hace mientras se arrastra el mouse y mientras se mantiene pulsado el boton izquierdo del mouse, esto sin modificar la imagen original. No tengo idea de como empezar, creo que tengo que dibujar sobre el canvas del image y manipular los eventos OnClick y el OnMouseMove,

He visitado el link buscar y ebcontre esto, pero no entiendo muy bien:

Código:

- Y en el evento OnMouseMove del TImage lo siguiente:

static int oldX=-1, oldY=-1;

  Image1->Canvas->Pen->Mode = pmXor;
  Image1->Canvas->Pen->Color = clWhite;
  Image1->Canvas->Pen->Width = 1;

  Image1->Canvas->MoveTo(oldX, 0);
  Image1->Canvas->LineTo(oldX, Image1->Height);
  Image1->Canvas->MoveTo(0, oldY);
  Image1->Canvas->LineTo(Image1->Width, oldY);

  Image1->Canvas->MoveTo(oldX=X, 0);
  Image1->Canvas->LineTo(X, Image1->Height);
  Image1->Canvas->MoveTo(0, oldY=Y);
  Image1->Canvas->LineTo(Image1->Width, Y);


Porfa si alguien me puede ayudar...

De antemano gracias.

Gracias.

Hasta pronto.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola jhonalba:

Declara las siguientes variables:
Código:
TRect rectSel;
bool bPulsado, bPrimerClick;

Y luego el siguiente código en los eventos OnMouseDown, OnMouseMove y OnMouseUp respectivamente del TImage:
Código:
void __fastcall TForm1::Image1MouseDown(TObject *Sender,
        TMouseButton Button, TShiftState Shift, int X, int Y)
{
    rectSel.Left = X;
    rectSel.Top = Y;
    bPulsado = bPrimerClick = true;
}

void __fastcall TForm1::Image1MouseMove(TObject *Sender,
        TShiftState Shift, int X, int Y)
{
    if (bPulsado)
    {
        if (!bPrimerClick)
            Image1->Canvas->DrawFocusRect(rectSel);
        rectSel.Right = X;
        rectSel.Bottom = Y;
        bPrimerClick = false;
        Image1->Canvas->DrawFocusRect(rectSel);
    }
}

void __fastcall TForm1::Image1MouseUp(TObject *Sender,
        TMouseButton Button, TShiftState Shift, int X, int Y)
{
    rectSel.Right = X;
    rectSel.Bottom = Y;
    bPulsado = false;
    Image1->Canvas->DrawFocusRect(rectSel);

    // ...
    // Aquí podemos dibujar la figura final por ejemplo
    // ...
}

DrawFocusRect usa el modo de dibujo XOR, por lo que al dibujar por segunda vez el recuadro en las mismas coordenadas lo "borra". En su lugar si prefieres que se vea más claramente el recuadro puedes dibujar cualquier cosa usando también el modo XOR.

Para evitar el parpadeo puedes poner las propiedades AutoSize y Stretch del TImage a true. O bien en lugar de esto poner 'DoubleBuffered = true' en el constructor del Form (aunque esto consume mas memoria).

Saludos:
_Leo
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Gracias _Leo Responder citando

Hola _Leo:

Muchas gracias por tu respuesta, era justo lo que buscaba.

Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Como se podria cambiar, el rectangulo, del focus, me refiero al color, o aumentar el tamaño de la lines de contorno
Volver arriba
Mensaje    Asunto: Responder citando

Solo tendrías que sustituir todas las coincidencias de "DrawFocusRect" por alguna función que dibuje cualquier cosa en modo XOR como lo hace esa función (o bien, NotXor o Not). Un ejemplo de esto usando el código anterior:

- Creamos la función que dibujará la selección:
Código:
void DibujarSeleccion(TCanvas* canvas, TRect rect)
{
    canvas->Pen->Mode = pmNotXor;
    canvas->Pen->Color = clYellow;
    canvas->Pen->Width = 4;
    canvas->Brush->Style = bsClear;
    canvas->Rectangle(rect);
}

- Y luego cambiamos todas las líneas donde sale DrawFocusRect por:
Código:
DibujarSeleccionXor(Image1->Canvas, rectSel);


Otro detalles es que Windows 95/98/ME no permiten usar plumas (Pen) que tengan un grosor mayor de 1 para dibujar líneas discontinuas. En Windows NT/2K/XP/2003 si, pero usando el API:
(https://cppbuilder.es/viewtopic.php?t=8188)
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias Leo, por la respuesta, era justo lo que necesitaba.
Volver arriba
Mensaje    Asunto: borrar restangulos Responder citando

Estoy intentando seleccionar una parte de un Timage y guardarlo.
He estado mirando codigos en el foro. Creo que estoy cerca de la solución.

Uso este codigo de LEO para dibujar en el TIMAGE la zona a capturar.
Código:
void __fastcall Tassistent::Image1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
    //Image1->Canvas->
    //Image1->Repaint();

    rectSel.Left = X;
    rectSel.Top = Y;
    rectSel.Right = X+100; //afeg
    rectSel.Bottom = Y+100; //afegi
    bPulsado = bPrimerClick = true;
    Image1->Canvas->DrawFocusRect(rectSel);
    this->DibujarSeleccion(Image1->Canvas, rectSel);

}


La idea seria borrar el dibujo anterior en el canvas cada vez que pinto uno de nuevo. Pero no atino a borrar los rectangulos del canvas.

Alguna idea. Gracias.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Borro!! Responder citando

Ya borro pero dibujo encima del anteriormente dibujado!!
Funciona + o -.

DE todas formas si alguien me puede echar una mano. Intento borrar todo lo dibujado en el Canvas!!! se puede?
Y después pues, guardar en un Timage la seleccion.

Mil gracias.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.