 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
jhonalba Ens


Registrado: 24 Ago 2002Mensajes: 40Ubicación: Colombia
|
Publicado: Mar 21 Ene, 2003 1:50 am Asunto: Dibujar un cuadrado sobre el canvas..novata |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 21 Ene, 2003 3:56 am Asunto: |
|
|
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 |
|
 |
jhonalba Ens


Registrado: 24 Ago 2002Mensajes: 40Ubicación: Colombia
|
Publicado: Mie 22 Ene, 2003 2:31 am Asunto: Gracias _Leo |
|
|
Hola _Leo:
Muchas gracias por tu respuesta, era justo lo que buscaba.
Saludos. |
|
| Volver arriba |
|
 |
trolls Invitado
|
Publicado: Mie 07 Jul, 2004 9:00 pm Asunto: |
|
|
| Como se podria cambiar, el rectangulo, del focus, me refiero al color, o aumentar el tamaño de la lines de contorno |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mie 07 Jul, 2004 10:13 pm Asunto: |
|
|
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 |
|
 |
trolls Invitado
|
Publicado: Lun 12 Jul, 2004 6:22 pm Asunto: |
|
|
| Gracias Leo, por la respuesta, era justo lo que necesitaba. |
|
| Volver arriba |
|
 |
amas2 Lt

Registrado: 01 Jun 2004Mensajes: 91
|
Publicado: Mar 31 Ago, 2004 11:15 am Asunto: borrar restangulos |
|
|
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 |
|
 |
amas2 Lt

Registrado: 01 Jun 2004Mensajes: 91
|
Publicado: Mar 31 Ago, 2004 12:33 pm Asunto: Borro!! |
|
|
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|