Pregunta

Estoy desarrollando un control de mapa en WPF con C #. Estoy usando un control de lienzo, p. 400 x 200 que tiene asignada un área de mapa de p. Ej. 2,000m x 1,000m.

La escala del mapa sería: canvas_size_in_meters / real_size_in_meters .

Quiero encontrar el canvas_size_in_meters.

El lienzo.ActualWidth proporciona el ancho en DIU (unidades independientes del dispositivo). Entonces, 400 DIU es 400/96 = 4,17 pulgadas, PROPORCIONADO que la resolución física de mi monitor es de 96 ppp.

Sin embargo, usando una regla, descubrí que la resolución física de mi monitor es de 87 ppp. (Solo hay unos pocos monitores que REALMENTE tienen 96 dpi físicos)

Esa diferencia de DPI (10%) se traduce en una diferencia de + 10% en el ancho real de control del mapa en la pantalla.

¿Cómo mido el tamaño de un control WPF en pulgadas EXACTAMENTE e independientemente de la resolución de pantalla y la configuración de DPI?

¿Fue útil?

Solución

  

¿Cómo mido el tamaño de un control WPF en pulgadas EXACTAMENTE e independientemente de la resolución de pantalla y la configuración de DPI?

Esto no es realmente posible, porque para que funcione, WPF tendría que conocer la resolución (en términos de DPI) de su monitor. Suena bien en teoría, pero en la práctica Windows no conoce esta información. Es por eso que Windows siempre asume 96 ppp a ciegas en lugar de ser más inteligente al respecto.

Incluso si hubiera alguna forma de decirlo manualmente, o si su monitor en particular tiene un controlador personalizado que pasa la información correcta a Windows, esto no funcionará en la computadora de otra persona, por lo que Windows no pasa esta información en cualquier aplicación.

Lo mejor que puedes hacer es dibujar una escala como lo hace Google Maps. Usted sabe que 1 píxel == 1 milla, por lo que puede dibujar una línea de 50 píxeles en su mapa, con una etiqueta que diga "esta línea equivale a 50 millas"

Otros consejos

Hay una manera de calcular el tamaño de píxel actual en mm o pulgadas. Como se mencionó en las publicaciones anteriores, no es un valor fijo y variaría según la resolución actual y el tamaño del monitor.

Primero obtenga la resolución actual. Supongamos que es 1280x1024 Ahora obtenga el ancho del monitor en mm con la función GetDeviceCaps. Es una función de biblioteca estándar de Windows.

int widthmm = GetDeviceCaps (deviceContext, HORZSIZE); El ancho de mi monitor es de 362 mm

Entonces tamaño de píxel = 362/1280 = 0.282 mm

La precisión de este método depende de la suposición de que el área de visualización cubre exactamente el ancho del monitor.

Entonces, para responder la pregunta original, el tamaño del lienzo de 400 x 200 píxeles sería (400 * 0.282 / 1000) x (200 * 0.282 / 1000) en metros cuando se muestra en mi monitor.

Gracias por su pronta respuesta.

Estoy totalmente de acuerdo, pero no quería creerlo en primer lugar. Verá, debe haber un cálculo aproximado de la escala del mapa si el mapa se usa para mostrar diferentes capas de datos del mapa (dependiendo de la escala). La mayoría de las aplicaciones usan un control deslizante con, p. 10 niveles de mapa discretos para establecer la "escala".

Tener una escala absoluta no es crucial para la aplicación, sería bueno mostrar una escala indicativa , como 1: 15,000.

Una escala absoluta requeriría una variable adicional monitorPhysicalDPI (inicialmente establecida en 96) que si el uso elige cambiar daría una escala ligeramente mejor (nuevamente no es crucial). El tamaño del control del mapa sería:

map.ActualWidth * (96 / monitorPhysicalDPI) * inchesPerDIU, inchesPerDIU es 1/96

Nuevamente, estos son cosméticos ... ¿No sería bueno si Windows supiera las dimensiones del control REAL? (el usuario debería proporcionar información sobre las dimensiones de la pantalla en la configuración del sistema operativo, o simplemente instalar el archivo INF del monitor)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top