为什么1920设备无关单元不是1920像素,96 DPI?

时间:2016-03-23 15:37:02

标签: wpf screen-resolution dpi

我的Windows设置被设置为DPI为96.但是,当我创建以下Window时,它将比我的屏幕(设置为1920 * 1080分辨率)小一点:

<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 个答案:

答案 0 :(得分:5)

问题更多的是:

  

为什么Window.ActualWidth报告的宽度似乎不是真实的&#39;窗口的宽度?

答案是看起来像窗口的整个宽度并不完全是完整的宽度。

当您设置Width时,查询ActualWidth,甚至使用GetWindowRect来获取&#34; no-lies,Windows认为我的宽度是什么&#34;,您正在设置或获取窗口的宽度,包括不可见部分

这些不可见的部分,特别是在Windows 10上,包含一些额外的空间,使用户可以轻松调整窗口的大小,即使它们稍微偏离边界:

resize off of the window

(请注意,我的鼠标不在边框上,而是在右边有点偏离)

这意味着当你最大化你的窗户时,你的宽度仍然是&#34;填充&#34;使用那个不可见的空间,因此您的窗口大小将大于您的屏幕大小。

如何检索额外空间的宽度? SM_CXSIZEFRAMESM_CXPADDEDBORDERint extraBorderStuff = GetSystemMetrics(SystemMetric.SM_CXSIZEFRAME) + GetSystemMetrics(SystemMetric.SM_CXPADDEDBORDER); double realWidthForSure = ActualWidth - borderSize * 2; 的{​​{3}}是您的朋友(示例包含来自GetSystemMetrics的代码):

realWidthForSure

如果您随后最大化了窗口,则应注意<video>...</video>应该等于您期望的1920px。

答案 1 :(得分:3)

窗口的宽度实际为1936像素!

当窗口最大化时,会裁剪其周围的边框。虽然它不再可见,但它仍被视为窗口的一部分。在Aero主题中,这个边框的每边宽度为8px,因此额外增加了16px:

Window chrome in Aero theme

如果切换到经典主题,每侧只有4像素,因此您的窗口宽度为1928像素。

答案 2 :(得分:-1)

您的屏幕规格是什么?例如我的显示器间距= 0.282毫米;等于90.0709 ... ppi。在WPF中,1920像素宽的窗口的实际宽度为2,046个单位。

确定您的屏幕的DPI(如果您的音高为mm,则为25.4 /音高)

96 / DPI * 1920 =&gt;实际宽度