2016-03-23 21 views
7

impostazioni mie finestre sono impostati per avere un DPI di 96. Tuttavia quando ho creare la seguente Window sarà un po 'più piccolo poi il mio schermo (che è impostato per la risoluzione di 1920 * 1080):Perché le unità indipendenti dal dispositivo 1920 non sono 1920 pixel con 96 DPI?

<Window x:Class="WPF_Sandbox.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:WPF_Sandbox" 
     mc:Ignorable="d" 
     Title="MainWindow" 
     Width="1920"> 
</Window> 

Secondo a this msdn post del blog:

1 pixel indipendente dal dispositivo = 1/96 di pollice.
1 pixel fisico = 1/DPI (dipendente dal DPI di sistema)

Le impostazioni di sistema predefinite in genere scelgono un DPI di 96 in modo che questi due tipi di pixel risultino della stessa dimensione.

Tuttavia questo non sembra essere il caso poiché il mio Window è chiaramente meno di 1920 pixel di larghezza.
Se si ingrandisce lo Window e si controlla il suo ActualWidth, sembra che sia 1936.

Perché è questo il caso?

risposta

3

la questione è più lungo le linee di:

Perché il Window.ActualWidth segnalare una larghezza che non sembra essere la larghezza 'reale' della finestra?

La risposta è che ciò che appare come l'intera larghezza della finestra non è esattamente la larghezza .

Quando si imposta la Width, interrogare la ActualWidth, o anche utilizzare GetWindowRect per ottenere il "no-si trova quello che fa le finestre che la mia larghezza è", si sta impostando o di ottenere la larghezza della finestra tra cui parti invisibili .

Quelle parti invisibili, in particolare su Windows 10, include un po 'di spazio in più per rendere più facile per gli utenti di ridimensionare la finestra, anche se sono un po' fuori del confine:

resize off of the window

(notare che il mio mouse non è sul bordo ma piuttosto un po 'sulla destra)

Ciò significa che quando si ingrandisce la finestra, la larghezza è ancora "imbottita" con quello spazio invisibile, e quindi la finestra la dimensione sarà più grande della dimensione dello schermo.

Come si può recuperare la larghezza dello spazio extra? GetSystemMetrics con SM_CXSIZEFRAME e SM_CXPADDEDBORDER è tuo amico qui (esempio include il codice da pinvoke.net):

int extraBorderStuff = GetSystemMetrics(SystemMetric.SM_CXSIZEFRAME) 
         + GetSystemMetrics(SystemMetric.SM_CXPADDEDBORDER); 
double realWidthForSure = ActualWidth - borderSize * 2; 

Se quindi ingrandire la finestra, si dovrebbe notare che realWidthForSure dovrebbe essere uguale vostro 1920px che ci si aspetterebbe.

+0

Fondamentalmente, quando massimizzo 'Window', sarà più grande dello schermo (quindi' Width' è '1936') a causa del bordo invisibile. Gotcha. –

+0

@TimPohlmann sì; aggiunto un po 'di più alla risposta per affermarlo. – FriendlyGuy

-1

Quali sono le specifiche dello schermo? per es. il mio monitor ha altezza = 0,282 mm; che è uguale a 90.0709 ... ppi. Una finestra larga 1920 pixel avrebbe una larghezza effettiva di 2046 unità in WPF.

determinare DPI del vostro schermo (25,4/pitch se avete passo in mm)

96/DPI * 1920 => Actual Larghezza

+0

In che modo WPF conosce il DPI fisico del mio monitor? Secondo il blog post collegato utilizza il DPI di sistema di Windows, che è impostato su 96. –

3

La finestra ha davvero una larghezza di 1936 pixel!

Quando una finestra è ingrandita, il bordo attorno ad esso viene ritagliato. Anche se non è più visibile, è ancora considerato parte della finestra. Nel tema Aero, questo confine ha una larghezza di 8px su ogni lato, da qui il 16px in più:

Window chrome in Aero theme

Se si passa al tema classico, è solo 4px su ogni lato, quindi la finestra sarebbe 1928 pixel di larghezza.

+0

Ma il mio schermo ha solo 1920 pixel. –

+0

La finestra è più larga dello schermo. –

+0

Ma non lo è. C'è spazio lasciato su entrambi i lati. –

Problemi correlati