2009-12-16 13 views
29

El MSDN no proporciona, en mi humilde opinión, una clara diferencia entre Control.PointToScreen (link) y Control.PointToClient (link) métodos.control PointToClient() vs PointToScreen()

¿Hay alguien que podría explicar en pocas palabras cuál es la diferencia entre estos métodos? Especialmente no está claro para mí la noción de "Cliente".

Entiendo PointToScreen la coordenada de pantalla real (con [0, 0] en la esquina superior izquierda de la pantalla) del punto dado.

Por ejemplo, la depuración de un cierto código que tienen

?click.Location 
{X = 3 Y = 9} 

?shapeSender.PointToClient(click.Location) 
{X = -470 Y = -565} 

?shapeSender.PointToScreen(click.Location) 
{X = 476 Y = 583} 

Gracias.

Respuesta

40

La mejor manera de pensarlo es: las relativas relativas a las coordenadas de absolución. Donde la coordenada relativa es relativa desde la esquina superior izquierda del área del cliente de una ventana. El área de cliente de una ventana es una ventana menos su borde. Las coordenadas relativas son útiles porque no cambian cuando el usuario mueve una ventana y no depende del borde y el tamaño de la ventana.

La mayoría de las coordenadas en Winforms son coordenadas relativas, MouseEventArgs.Location por ejemplo. Algunos son absolutos, Cursor.Position por ejemplo. Si pasa una coordenada relativa a PointToClient obtendrá basura, como vio en su sesión de depuración. Debe ser una coordenada absoluta.

Algunas propiedades de coordenadas aparentemente pueden ser ambas, Control.Location por ejemplo. En un control secundario, representa la ubicación relativa del control desde su contenedor. La ubicación de un formulario es absoluta. Esa aparente contradicción desaparece cuando crees que una ubicación de control es relativa desde el control de un padre. El padre de un formulario es el escritorio.

Un uso común es asignar una coordenada relativa a un control a otro control. Primero asigne a coordenadas de pantalla absolutas con control1.PointToScreen(), luego asigne el resultado al otro control con control2.PointToClient(). El valor del Punto cambia por el desplazamiento entre los controles, independientemente de quiénes sean sus padres. Hacerlo de otra manera es muy doloroso.

Manténgase alejado de problemas al solo pasar una coordenada absoluta a PointToClient y una coordenada relativa a PointToScreen.

+0

Hubo un (rechazado) [sugerencia de edición] (http://stackoverflow.com/review/suggested-edits/2557841) que menciona que no hay ninguna propiedad llamada 'Mouse.Position'. Esto me parece correcto. Me gustaría aplicar la edición, pero no sé las formas de Winforms, así que no sé si te refieres a 'Control.MousePosition' o' Cursor.Location' – doubleDown

+0

Supuse que podrían haberlo llamado PointFromClientToScreen, pero eso es exagerado. Dado que PointFromScreenToScreen simplemente no tiene sentido. –

+0

Tuve que eliminar mi comentario anterior. * * Da coordenadas de pantalla. –

4

Las coordenadas del "cliente" están relacionadas con la parte superior izquierda del área del cliente del control. Las coordenadas de "pantalla" están relacionadas con la parte superior izquierda del monitor (principal).

El "área de cliente" es el área de un control en el que se pueden colocar controles secundarios. El rectángulo del cliente de un formulario es el área dentro del formulario, excluyendo los bordes y la barra de título. Para la mayoría de los otros controles, el área del cliente es la misma que el área que el control ocupa en la pantalla.

PointToScreen convierte las coordenadas del cliente en coordenadas de pantalla. PointToClient hace lo contrario: convierte las coordenadas de la pantalla en coordenadas del cliente.

3

Supongamos que una pantalla es de 800x600 y una ventana tiene 50,50 y tiene un tamaño de 200x200 píxeles. Si el punto P se encuentra en 10,10 relativo a la ventana superior izquierda, entonces PointToScreen (P) devolverá 60,60. Si esta P se asigna a PointToClient (P) con el identificador de ventana, obtendremos 10,10 de nuevo.

Hope que despeja la confusión

+0

¿Qué pasa si en la ventana tengo un panel en 10, 10 y llamo un método de botón (a 5, 5 en el panel) PointToClient ([5, 5])? – serhio

9

El método PointToClient es la inversa del método PointToScreen.

(Si no fuera tan largo y repetitivo, que serían nombrados ScreenPointToClientPoint y ClientPointToScreenPoint.)

utiliza el conversiones cuando se tiene un tipo de coordenadas y la necesidad del otro, por ejemplo, si usted tiene la las coordenadas de un clic de mouse relativas a la pantalla, y necesitan saber en qué parte del control hizo clic el usuario.

Si convierte un punto de pantalla que está fuera del área del cliente, obtendrá componentes de coordenadas que son negativos o mayores que el tamaño del área del cliente de control.

Cuestiones relacionadas