2012-04-19 14 views
6

Estoy buscando una propiedad que me proporcione la ubicación de un Control relativa a la ubicación de su Formulario, no al Formulario ClientRectangle's "0,0".¿Cómo obtengo la ubicación de un control en relación con la ubicación de su formulario?

Por supuesto que puedo convertir todo en coordenadas de pantalla, pero me pregunto si hay una forma más directa de hacerlo.

+0

¿Qué quiere decir exactamente por ubicación de _control_ es la ubicación del cursor que desea? – uday

+0

@uDaY Es decir: en coordenadas de pantalla. Si el formulario está en 100,100 y el control está en 150,350, quiero obtener 50,250. – ispiro

+0

Cuidado: http://stackoverflow.com/questions/8838621/how-to-determine-actual-windows-form-size-with-all-nonclient-elements-when-run –

Respuesta

2

Parece que la respuesta es que no hay una forma directa de hacerlo.

(. Como dije en la pregunta que estoy buscando una manera otra que el uso de coordenadas de la pantalla)

9

Necesita convertir a coordenadas de pantalla y luego hacer algunas operaciones matemáticas.

Point controlLoc = form.PointToScreen(myControl.Location); 

La ubicación del formulario ya está en las coordenadas de la pantalla.

Ahora:

Point relativeLoc = new Point(controlLoc.X - form.Location.X, controlLoc.Y - form.Location.Y); 

que le dará la ubicación con respecto a la esquina superior izquierda del formulario, en lugar de con respecto al área de cliente del formulario.

+0

Gracias por su respuesta, pero como escribí en la pregunta, estoy buscando una forma más directa que consultar las coordenadas de la pantalla. – ispiro

+1

@ispiro: No hay una forma más directa incorporada. Podría fácilmente incluir esa lógica en una pequeña función a la que puede llamar. O bien, cuando se muestra el formulario por primera vez, puede llamar a 'form.PointToScreen (new Point (0, 0))', guardar el resultado, y luego simplemente agregar los valores X e Y a 'Location' del control cuando desee obtener sus coordenadas relativas a la ventana. –

+0

Con respecto a mi último comentario. Quise decir que llamas a 'PointToScreen' para obtener la ubicación del área del cliente del formulario y restar los valores X e Y de la ubicación para obtener los desplazamientos. Lo siento por eso. –

3

Creo que esto responderá a su pregunta. Tenga en cuenta que "este" es la forma.

Rectangle screenCoordinates = control.Parent.ClientToScreen(control.ClientRectangle); 
Rectangle formCoordinates = this.ScreenToClient(screenCoordinates); 
+0

Gracias por su respuesta, pero como escribí en la pregunta, estoy buscando una forma más directa que consultar las coordenadas de la pantalla. – ispiro

+0

+1 para la entrada. – ispiro

1

La respuesta seleccionada se técnicamente correcta, dado las características específicas de la cuestión: este tipo de propiedad hace no existe en el marco de .NET.

Pero si desea una propiedad así, aquí hay una extensión de control que hará el truco. Sí, usa coordenadas de pantalla, pero dada la naturaleza general del título de la publicación, estoy seguro de que a algunos usuarios que visiten esta página les puede resultar útil.

A propósito, pasé un par de horas tratando de hacer esto sin coordenadas de pantalla al pasar por todos los padres de control. Nunca podría obtener los dos métodos para reconciliar. Esto bien puede ser debido al comentario de Hans Passant al OP sobre cómo Aero miente sobre el tamaño de la ventana.

using System; 
using System.Drawing; 
using System.Windows.Forms; 

namespace Cambia 
{ 
    public static class ControlExtensions 
    { 
     public static Point FormRelativeLocation(this Control control, Form form = null) 
     { 
      if (form == null) 
      { 
       form = control.FindForm(); 
       if (form == null) 
       { 
        throw new Exception("Form not found."); 
       } 
      } 

      Point cScreen = control.PointToScreen(control.Location); 
      Point fScreen = form.Location; 
      Point cFormRel = new Point(cScreen.X - fScreen.X, cScreen.Y - fScreen.Y); 

      return cFormRel; 

     } 

    } 
} 
+1

Esta es una gran solución. Aunque, creo que querías devolver 'cFormRel'. – dshrout

Cuestiones relacionadas