Question

Je développe un contrôle de carte dans WPF avec C #. J'utilise un contrôle canvas par exemple. 400 x 200 auquel est attribuée une zone de carte, par exemple: 2 000 mx 1 000 m.

L'échelle de la carte serait la suivante: canvas_size_in_meters / real_size_in_meters .

Je veux trouver le canvas_size_in_meters.

Le canevas.ActualWidth donne la largeur en DIU (unités indépendantes du périphérique). Ainsi, 400 DIU = 400/96 = 4,17 pouces, FOURNIS , la résolution physique de mon moniteur est de 96 dpi.

Cependant, avec une règle, j'ai constaté que la résolution physique de mon moniteur était de 87 dpi. (Il n’existe ACTUELLEMENT que 96 moniteurs dotés de 96 moniteurs physiques)

Cette différence DPI (10%) se traduit par une différence de + 10% dans la largeur réelle du contrôle de la carte à l'écran.

Comment mesurer la taille d’un contrôle WPF en pouces EXACTEMENT, quels que soient la résolution de l’écran et le réglage DPI?

Était-ce utile?

La solution

  

Comment mesurer la taille d’un contrôle WPF en pouces EXACTEMENT, quels que soient la résolution de l’écran et le réglage DPI?

Cela n’est pas réellement possible, car pour que cela fonctionne, WPF doit connaître la résolution (en termes de DPI) de votre moniteur. Cela semble bien en théorie, mais dans la pratique, Windows ne connaît pas cette information. C’est la raison pour laquelle Windows suppose toujours aveuglément une résolution de 96 dpi au lieu d’être plus intelligent.

Même s'il y avait un moyen de le dire manuellement ou si votre moniteur particulier a un pilote personnalisé qui transmet les informations correctes à Windows, cela ne fonctionnera pas sur l'ordinateur de quelqu'un d'autre et Windows ne passera pas. ces informations sur toutes les applications.

Le mieux que vous puissiez faire est de dessiner une échelle comme le fait Google Maps. Vous savez que 1 pixel == 1 mile, vous pouvez donc tracer une ligne de 50 pixels sur votre carte, avec une étiquette indiquant "Cette ligne est égale à 50 miles".

Autres conseils

Il existe un moyen de calculer la taille de pixel actuelle en mm ou en pouces. Comme mentionné dans les précédents articles, il ne s’agit pas d’une valeur fixe et varierait en fonction de la résolution actuelle et de la taille de l’écran.

Commencez par obtenir la résolution actuelle. Supposons que c'est 1280x1024 Maintenant, obtenez la largeur du moniteur en mm en utilisant la fonction GetDeviceCaps. C'est une fonction standard de la bibliothèque Windows.

int widthmm = GetDeviceCaps (deviceContext, HORZSIZE); La largeur de mon moniteur est de 362 mm

Donc, la taille en pixels = 362/1280 = 0,282 mm

La précision de cette méthode dépend de l'hypothèse selon laquelle la zone d'affichage couvre exactement la largeur du moniteur.

Donc, pour répondre à la question initiale, la taille de la toile de 400 x 200 pixels serait (400 * 0,282 / 1000) x (200 * 0,282 / 1000) en mètres lors de l'affichage sur mon moniteur.

Merci pour votre réponse rapide.

Je suis totalement d'accord, mais je ne voulais pas y croire. Vous voyez, il doit y avoir un calcul approximatif de l'échelle de la carte si la carte est utilisée pour afficher différentes couches de données cartographiques (en fonction de l'échelle). La plupart des applications utilisent un contrôle de curseur avec par exemple 10 niveaux de carte distincts pour définir "l'échelle".

Le fait d’avoir une échelle absolue n’est pas crucial pour l’application, il serait bon d’afficher une échelle indicative , telle que 1:15 000.

Une échelle absolue exigerait une variable supplémentaire monitorPhysicalDPI (initialement définie sur 96) qui, si l'utilisation choisissait de changer, donnerait une mise à l'échelle légèrement meilleure (là encore, ce n'est pas crucial). La taille du contrôle de la carte serait:

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

Encore une fois, ce sont des cosmétiques .. Ne serait-il pas intéressant que Windows connaisse les dimensions du contrôle ACTUAL? (l’utilisateur devra donner des informations sur les dimensions de l’écran lors de la configuration du système d’exploitation, ou simplement installer le fichier INF du moniteur)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top