2008-11-18 12 views
12

Estoy desarrollando un control de mapa en WPF con C#. Estoy usando un control canvas, p. 400 x 200 a la que se le asigna un área de mapa de, p. 2,000m x 1,000m.C# WPF resolution independent?

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

Quiero encontrar el canvas_size_in_meters.

El canvas.ActualWidth da el ancho en DIU (Unidades independientes del dispositivo). Por lo tanto, 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, encontré que la resolución física de mi monitor es de 87 ppp. (Hay pocos monitores que REALMENTE tengan 96 dpi físicos)

Esa diferencia DPI (10%) se traduce a una diferencia de + 10% en el ancho de control del mapa real 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?

Respuesta

9

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

Esto no es posible, porque para que funcione, WPF debería 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. Esta es la razón por la que Windows siempre asume 96 ppp a ciegas en lugar de ser más inteligente al respecto.

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

Lo mejor que puedes hacer es dibujar una escala como 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 dice "esta línea equivale a 50 millas"

0

Gracias por su pronta respuesta.

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

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

Una escala absoluta requeriría para una variable adicional monitorPhysicalDPI (inicialmente establecida en 96) que si los usos deciden cambiar daría una escala ligeramente mejor (de nuevo, no es crucial). El tamaño del control del mapa sería:

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

Una vez más se trata de cosméticos .. ¿No sería agradable si Windows sabía las dimensiones del control real? (el usuario debería dar información sobre las dimensiones de la pantalla en la configuración del sistema operativo o simplemente instalar el archivo INF del monitor)

+0

Estaría genial. Puede ver documentos de Word y PDF, configurarlos con un zoom del 100% y ver el tamaño de página correcto. Estoy sorprendido de que no hayan intentado arreglar esto hace años :-( –

1

Hay forma de calcular el tamaño del píxel actual en mm o pulgadas. Como se mencionó en las publicaciones anteriores, no es un valor fijo y podría variar 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 usando la función GetDeviceCaps. Es una función de biblioteca de Windows estándar.

int widthmm = GetDeviceCaps (deviceContext, HORZSIZE); Mi monitor es ancho 362mm

Así 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 el ancho del monitor exactamente.

Para responder a 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 muestre en mi monitor.