Domanda

Sto sviluppando un controllo della mappa in WPF con C #. Sto usando un controllo tela ad es. 400 x 200 a cui è assegnata un'area della mappa, ad es. 2.000 m x 1.000 m.

La scala della mappa sarebbe: canvas_size_in_meters / real_size_in_meters .

Voglio trovare canvas_size_in_meters.

Il canvas.ActualWidth fornisce la larghezza in DIU (unità indipendenti dal dispositivo). Pertanto, 400 DIU sono 400/96 = 4,17 pollici, FORNITO che la risoluzione fisica del mio monitor è 96 dpi.

Tuttavia, usando un righello, ho scoperto che la risoluzione fisica del mio monitor è di 87 dpi. (Ci sono solo pochi monitor che REALMENTE hanno 96 dpi fisici)

La differenza DPI (10%) si traduce in una differenza del + 10% nella larghezza effettiva del controllo della mappa sullo schermo.

Come si misura la dimensione di un controllo WPF in pollici ESATTAMENTE e indipendentemente dalla risoluzione dello schermo e dall'impostazione DPI?

È stato utile?

Soluzione

  

Come si misura la dimensione di un controllo WPF in pollici ESATTAMENTE e indipendentemente dalla risoluzione dello schermo e dall'impostazione DPI?

Questo in realtà non è possibile, perché per funzionare, WPF dovrebbe conoscere la risoluzione (in termini di DPI) del monitor. In teoria suona bene, ma in pratica Windows non conosce queste informazioni. Questo è il motivo per cui Windows stesso assume sempre 96 dpi alla cieca invece di essere più intelligente al riguardo.

Anche se ci fosse un modo per dirlo manualmente o se il tuo monitor particolare ha un driver personalizzato che trasmette le informazioni corrette a Windows, questo non funzionerà sul computer di nessun altro, quindi Windows non passa queste informazioni su qualsiasi applicazione.

Il meglio che puoi fare è disegnare una scala come fa Google Maps. Sai che 1 pixel == 1 miglio, quindi puoi disegnare una linea di 50 pixel sulla tua mappa, con un'etichetta che dice " questa linea equivale a 50 miglia "

Altri suggerimenti

Esiste un modo per calcolare la dimensione attuale dei pixel in mm o pollici. Come menzionato nei post precedenti, non è un valore fisso e varierebbe in base alla risoluzione corrente e alle dimensioni del monitor.

Per prima cosa ottieni la risoluzione corrente. Supponiamo che sia 1280x1024 Ora ottieni la larghezza del monitor in mm usando la funzione GetDeviceCaps. È una funzione standard di libreria di Windows.

int widthmm = GetDeviceCaps (deviceContext, HORZSIZE); La larghezza del mio monitor è di 362 mm

Quindi la dimensione dei pixel = 362/1280 = 0,282 mm

L'accuratezza di questo metodo dipende dal presupposto che l'area di visualizzazione copra esattamente la larghezza del monitor.

Quindi, per rispondere alla domanda originale, le dimensioni della tela di 400 x 200 pixel sarebbero (400 * 0,282 / 1000) x (200 * 0,282 / 1000) in metri quando mostrato sul mio monitor.

Grazie per la pronta risposta.

Sono totalmente d'accordo, ma non volevo crederci in primo luogo. Vedete, ci deve essere un approssimativo calcolo della scala della mappa se la mappa viene utilizzata per visualizzare diversi livelli di dati della mappa (dipendenti dalla scala). La maggior parte delle applicazioni utilizza un controllo a scorrimento con ad es. 10 livelli discreti della mappa per impostare la "scala".

Avere una scala assoluta non è cruciale per l'applicazione, sarebbe bello mostrare una scala indicativa , come 1: 15.000.

Una scala assoluta richiederebbe una variabile extra monitorPhysicalDPI (inizialmente impostata su 96) che se gli usi scelgono di cambiare darebbe un ridimensionamento leggermente migliore (di nuovo non è cruciale). La dimensione del controllo della mappa sarebbe:

map.ActualWidth * (96 / monitorPhysicalDPI) * polliciPerDIU, polliciPerDIU è 1/96

Ancora una volta questi sono cosmetici .. Non sarebbe bello se Windows conoscesse le dimensioni del controllo ACTUAL? (l'utente dovrebbe fornire informazioni sulle dimensioni dello schermo durante l'installazione del sistema operativo o semplicemente installare il file INF del monitor)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top