Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 为什么1920个设备独立单元不是具有96 DPI的1920像素?_Wpf_Screen Resolution_Dpi - Fatal编程技术网

Wpf 为什么1920个设备独立单元不是具有96 DPI的1920像素?

Wpf 为什么1920个设备独立单元不是具有96 DPI的1920像素?,wpf,screen-resolution,dpi,Wpf,Screen Resolution,Dpi,我的Windows设置的DPI设置为96。但是,当我创建以下窗口时,它将比我的屏幕(分辨率设置为1920*1080)小一些: 根据msdn博客文章: 1个设备独立像素=1/96英寸。 1个物理像素=1/DPI(取决于系统DPI) 默认系统设置通常选择96的DPI,因此这两种类型的像素大小相同 然而,情况似乎并非如此,因为我的窗口明显小于1920像素宽。 如果我将窗口最大化并检查其实际宽度,它似乎是1936 为什么会这样?您的屏幕规格是什么?例如,我的显示器的螺距为0.282毫米;等于90.0

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


根据msdn博客文章:

1个设备独立像素=1/96英寸。
1个物理像素=1/DPI(取决于系统DPI)

默认系统设置通常选择96的DPI,因此这两种类型的像素大小相同

然而,情况似乎并非如此,因为我的
窗口
明显小于1920像素宽。
如果我将
窗口最大化
并检查其
实际宽度
,它似乎是
1936


为什么会这样?

您的屏幕规格是什么?例如,我的显示器的螺距为0.282毫米;等于90.0709。。。ppi。1920像素宽的窗口实际宽度为2046个单位(WPF)

确定屏幕的DPI(如果以毫米为单位,则为25.4/节距)


96/DPI*1920=>实际宽度

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

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


如果切换到经典主题,则每侧仅为4px,因此您的窗口将为1928像素宽。

问题更多的是:

为什么Window.ActualWidth报告的宽度似乎不是窗口的“真实”宽度

答案是看起来像窗户的全宽并不是全宽

当您设置
宽度
、查询
实际宽度
、甚至使用
GetWindowRect
获取“无谎言windows认为我的宽度是多少”时,您正在设置或获取包含不可见部分的窗口宽度

这些不可见的部分,特别是在Windows 10上,包括一点额外的空间,以便用户可以轻松地调整窗口的大小,即使他们有点偏离边框:

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

这意味着当你最大化你的窗口时,你的宽度仍然被不可见的空间“填充”,因此你的窗口大小将大于你的屏幕大小

如何检索额外空间的宽度?使用
SM\u CXSIZEFRAME
SM\u CXPADDEDBORDER
是您在这里的朋友(示例包括以下代码):


如果您将窗口最大化,您应该注意到
realWidthForSure
应该等于您期望的1920px。

WPF如何知道我的显示器的物理DPI?根据链接的博客文章,它使用Windows的系统DPI,设置为96。但我的屏幕只有1920像素。窗口比你的屏幕宽。但它不是。两边都有空间。如果你在问题中添加一个屏幕截图会有所帮助。我已经弄明白了。你基本上是对的。Windows 10中有一个不可见的窗口边框,这让人非常困惑。因此,基本上,当我最大化
窗口时,它会比屏幕大(因此
宽度
1936
),因为边框是不可见的。明白了。@TimPohlmann是的;在回答中增加了一点说明。
<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>
int extraBorderStuff = GetSystemMetrics(SystemMetric.SM_CXSIZEFRAME)
                       + GetSystemMetrics(SystemMetric.SM_CXPADDEDBORDER);
double realWidthForSure = ActualWidth - borderSize * 2;