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 11-07-2004
Avatar de Picard
Picard Picard is offline
Miembro
 
Registrado: may 2004
Ubicación: Palamos
Posts: 23
Poder: 0
Picard Va por buen camino
Thumbs up Lines

Hola comapañeros. necesito dibujar una linea desde un punto en concreto (Latitude/Longitude) que esta en el centro de la pantalla hasta la posicion del puntero del mouse (LatCur/LongCur) deberia hacerse en el evento OnmouseMove, ya que necesito que la linea siempre este dibujada y siempre siga al puntero del mouse cuando este se mueve, alguna sugerencia?
gracias machotes
Responder Con Cita
  #2  
Antiguo 12-07-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
¿Sobre un formulario o sobre la pantalla sin importar que aplicación esté al frente?
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo 13-07-2004
Avatar de Picard
Picard Picard is offline
Miembro
 
Registrado: may 2004
Ubicación: Palamos
Posts: 23
Poder: 0
Picard Va por buen camino
sobre un panel
Responder Con Cita
  #4  
Antiguo 13-07-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
Cita:
Empezado por Picard
alguna sugerencia?
Las sugerencias que puedo darte no sé si sirvan a tus propósitos y además ten en cuenta que están enfocadas a Delphi aunque no creo que presente problemas trasladarlas a C++.

En primer lugar quizá podrías considerar otro tipo de superficie como un PaintBox en lugar de un Panel ya que este último carece de un Canvas para dibujar.

Si es forzoso el uso de una Panel entonces tendrás que crearle un Canvas. Para ello declara una variable PanelCanvas de tipo TCanvas misma que inicializas en algún lugar antes de comenzar a dibujar, por ejemplo en el constructor del formulario:

Código Delphi [-]
PanelCanvas := TPanel.Create;
PanelCanvas.Handle := GetDC(Panel.Handle);

Y no olvide destruirla con PanelCanvas.Free, por ejemplo en el destructor del formulario.

Ahora vamos a suponer que Center es una variable de tipo TPoint con las coordenadas desde donde parte la línea. Puedes inicializar Center con las coordenadas del centro de la pantalla aunque sospecho que más bien te refieres al centro del panel. Si realmente es el centro de la pantalla entonces deberás convertir las coordenadas absolutas a coordenadas relativas al panel:

Código Delphi [-]
Center := Point(Screen.Width div 2, Screen.Height div 2);
Center := Panel.ScreenToClient(Center);

Ahora bien, para dibujar una línea dispones de varios métodos del objeto Canvas como LineTo y PolyLine. La parte problemática está en cómo mover la línea ya que tienes que ir borrando la posicíon anterior conforme desplazas el puntero. Desafortunadamente esto no es fácil ya que una vez que dibujas algo sobre el canvas pierdes toda la información de lo que tenías abajo y "borrar la línea" significa que debes reemplazar justamente lo que había abajo antes de dibujarla.

La manera más fácil de lograr un efecto parecido es utilizando la técnica del XOR. Dibujar en modo XOR significa que el color de la pluma se combina con el color del canvas haciendo una operación xor de bits. Al repetir la operación xor se regresa a los bits originales, esto es, al color que originalmente haya habido.

La desventaja de este método es que no tienes control sobre el color de la línea que se va dibujando ya que depende del color del fondo.

Para implementar esto en el evento OnMouseMove lo único que tienes que hacer es, primero dibujar la línea anterior para borrarla y luego dibujar la línea en la nueva posición:

Código Delphi [-]
PanelCanvas.Polyline([Center, EndPoint]);
EndPoint := Point(X,Y);
PanelCanvas.Polyline([Center, EndPoint]);

donde EndPoint es una variable de tipo Point que va manteniendo el punto final de la línea y que conviene que inicialices a lo mismo que Center.

Algo muy común- que te pongo aquí a manera de resumen -es ir trazando la línea sólo cuando el botón del ratón está oprimido y dibujar la línea en su posición final (ahora sí con el color que se desee) al soltar el botón:

Código Delphi [-]
{
  Comenzamos el trazado tomando como punto
  base el punto donde se localiza el ratón
}
procedure PanelMouseDown(...);
begin
  if Button = mbLeft then
  begin
    MouseDown := true;

    PanelCanvas.Pen.Color := clWhite;
    PanelCanvas.Pen.Mode := pmXor;

    Center := Point(X, Y);
    EndPoint := Center;
  end;
end;

{
  Si el botón está presionado "movemos"
  la línea hasta el nuevo punto final
}
procedure MouseMove(...);
begin
  if MouseDown then
  begin
    PanelCanvas.Polyline([Center, EndPoint]);
    EndPoint := Point(X, Y);
    PanelCanvas.Polyline([Center, EndPoint]);
  end;
end;

{
  Terminamos el trazado y dibujamos
  la línea en su posición final
}
procedure MouseUp(...);
begin
  MouseDown := false;
  PanelCanvas.Pen.Mode := pmCopy;
  PanelCanvas.Pen.Color := clBlue;
  PanelCanvas.Polyline([Center, EndPoint]);
end;

Aquí MouseDown es una variable booleana para inicar si el botón del ratón está presionado.

// Saludos
Responder Con Cita
  #5  
Antiguo 13-07-2004
Avatar de Picard
Picard Picard is offline
Miembro
 
Registrado: may 2004
Ubicación: Palamos
Posts: 23
Poder: 0
Picard Va por buen camino
Lo siento mucho, conteste el mensaje a las 5:00 am, antes de ir a trabajar y lo hice rapido y sin tiempo para mas, he de crear la linea entre un punto teoricamente en el centro de la pantalla con las coordenadas (latitude)(Longitude) que son los valores que recibo desde un gps, hasta otro punto LatCur,LongCur que es la posicion del puntero del mouse,todo esto en un objeto TMap, lo que me ocurre es que este objeto tiene propiedad canvas pero no soy capaz de trazar esta linea, he provado con moveto y lineto pero no hay manera.

Gracias
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 13:21:47.


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