2016-03-23 5 views
7

настройки Мои окна установлены, чтобы иметь ДОИ 96. Однако при создании следующих Window будет немного меньше, чем мой экран (который устанавливается с разрешением 1920 * 1080):Почему 1920 устройств, независимых от устройства, не 1920 пикселей с 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> 

Согласно до this msdn сообщение в блоге:

1 независимый от устройства пиксель = 1/96 дюйма.
1 физический пиксель = 1/DPI (в зависимости от системы DPI)

Системные настройки по умолчанию обычно выбирают DPI 96, поэтому эти два типа пикселей имеют одинаковый размер.

Однако, похоже, что это не так, поскольку мой Window явно меньше 1920 пикселей в ширину.
Если я максимизирую Window и осмотрю его ActualWidth, это похоже на 1936.

Почему это так?

ответ

3

вопрос больше вдоль линий:

Почему Window.ActualWidth сообщить ширину, которая не появляется, чтобы быть «реальным» ширина окна?

Ответ заключается в том, что выглядит полная ширина окна не совсем полный ширина .

При установке Width запрос к ActualWidth, или даже использовать GetWindowRect, чтобы получить «не-лежит то, что делает окно думает, что моя ширина», вы устанавливаете или получить ширину окна, включая невидимые части ,

Эти невидимые части, особенно на Windows 10, включает в себя немного дополнительного пространства для создания легко для пользователей, чтобы изменить размер окна, даже если они немного от границы:

resize off of the window

(обратите внимание, что моя мышь не на границе, а скорее откусили вправо)

Это означает, что когда вы максимизировать окно, ваша ширина остается «мягкая» с этим невидимым пространством, и, таким образом, ваше окно размер будет больше размера вашего экрана.

Как вы можете получить ширину дополнительного пространства? GetSystemMetrics с SM_CXSIZEFRAME и SM_CXPADDEDBORDER ваш друг здесь (пример включает в себя код из pinvoke.net):

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

Если затем максимизировать окно, вы должны заметить, что realWidthForSure должна равняться вашей 1920px, что вы ожидали бы.

+0

Итак, когда я максимизирую «окно», он будет больше, чем экран (поэтому 'Width'' '1936') из-за невидимой границы. Попался. –

+0

@TimPohlmann да; добавили немного больше ответа на это. – FriendlyGuy

-1

Каковы ваши характеристики экрана? например. мой монитор имеет шаг = 0,282 мм; который равен 90.0709 ... ppi. Окно шириной 1920 пикселей будет иметь фактическую ширину 2046 единиц в WPF.

определяют DPI вашего экрана (25.4/шаг, если у вас есть шаг в мм)

96/DPI * 1920 => Фактическая ширина

+0

Как WPF знает физический DPI моего монитора? Согласно связанному сообщению в блоге, он использует системный DPI для Windows, который установлен на 96. –

3

окно действительно имеет ширину 1936 пикселей!

Когда окно максимально, граница вокруг него обрезана. Хотя он больше не виден, он все еще считается частью окна. В теме Aero, эта граница имеет ширину 8 пикселей на каждой стороне, отсюда 16px дополнительную:

Window chrome in Aero theme

Если вы переключитесь на классическую тему, это только 4px с каждой стороны, так что ваше окно будет 1928 пикселей в ширину.

+0

Но мой экран имеет только 1920 пикселей. –

+0

Окно шире экрана. –

+0

Но это не так. С обеих сторон остается пространство. –