Articles of dpi

如何使Windows 8.1知道我的Delphi应用程序想要支持每个监视器DPI?

我试图让Windows 8.1识别出我一直在尝试构build的Delphi XE6应用程序(一个演示程序),并且只有通过Manifest技术才能识别我的应用程序是Per-Monitor DPI。 Delphi XE6(以及所有其他类似Delphi的最新版本)使得在Project Options中添加一个易于执行的清单,并且我已经这样做了。 这是我使用MSDN资源确定的.manifest内容。 我怀疑它可能会稍微不正确。 如果你想尝试这个清单,做一个空的VCL应用程序,使用这个内容作为你的清单,并添加代码(代码是目前附加到我对这个问题的答案)。 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" > <!– Per Monitor DPI Awareness in Windows 8.1 uses asmv3:application + asmv3:windowsSettings –> <asmv3:application> <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> <dpiAware>True</dpiAware> </asmv3:windowsSettings> </asmv3:application> <!– Dear Microsoft, Don't Lie to Me About What Version of Windows I am On –> <compatibility […]

在150%的Windows显示设置仍然显示96 DPI

在运行Win7的笔记本电脑上,当我将显示设置设置为125%时,DPI显示为120(同时使用graphics.DpiX和GetDeviceCaps)。 但是,在150%的显示下,DPI是96(?!),就像是100%。 有没有人知道a)为什么是这种情况,b)除了检查DPI以检测显示器是否设置为100%以外,还有其他方法吗? 我正在编写一个应用程序,当显示设置为> = 150%时,我想显示一条消息。 谢谢。

如果部署PC具有不同的字体DPI,如何计算适当的字体大小?

我试图找出目标Windows机器上的字体DPI大小,并修改我们的应用程序的字体,使其看起来像目标机器具有与开发机器相同的dpi的相同的大小。 (所以更大的目标DPI将意味着我们会使字体小于开发时间)。 我想知道下面的解决scheme是否有问题,特别是LOGPIXELSX = 88是否正确。 背景 我调整窗体上的所有控件和字体的大小,以匹配当前的Windows屏幕分辨率。 但是,如果有人将Font DPI设置得更高,我们需要对其进行说明,并使字体变小 (因此屏幕上显示的尺寸最终会变大)。 我们的字体已经很大(尤其是因为我们调整它们的屏幕水平)。 来自较高DPI的额外尺寸使得文字太大。 我的解决scheme到目前为止从我可以告诉,如果我们使用GetDeviceCaps如下,然后得到CurrentFontDPI并执行此操作:(忽略由于新的屏幕分辨率的字体大小修改): NewFontSize = CurrentFontSize *(DevelopmentDPI / CurrentFontDPI) Function CurrentFontDPI Dim hwnd, hDC, logPix, r As Long Dim LOGPIXELSX=88 hwnd = GetDesktopWindow() hDC = GetDC(hwnd) logPix = GetDeviceCaps(hDC,LOGPIXELSX ) r = ReleaseDC(hwnd, hDC) CurrentFontDPI= logPix 结束function 仅供参考,上面的代码是“一个相关的SO问题”[1]中的一个较大的例程的一部分,我遗漏了其余的代码b / c似乎至less有一个错误(它有NewFont = OldFont *(NewDPI- OldDPI),如果DPI没有改变,它会给你零高度字体大小) [1]: […]

如何创build一个缩放和尺寸变化的Per-Monitor DPI感知应用程序,与Windows 7向后兼容?

我是WPF(和DPI意识API)的新手,正在编写一个在Windows 7,8.1和10中运行的应用程序。我使用多个监视器,每个监视器的DPI设置不同,并且有兴趣将我的应用程序设置为尽可能跨桌面configuration兼容。 我已经知道可以将一个Manifest添加到WPF应用程序中,取消注释DPI感知部分,并将其设置为True/PM 。 这成功地允许该程序在Windows 8.1和Windows 10(每个显示器上看起来清晰而清晰)中的每个显示器支持DPI,但在Windows 7中以系统感知的方式运行。 但是我们可以做得更好吗? 微软在这里提供了一个简洁的教程,展示了如何创build一个每个监视器的DPI-Aware WPF应用程序。 他们所做的实际上是在C ++中创build一个新的对象来replace使用Windows 8.1 API的<Window> ,以便不仅检测监视器之间的DPI更改,还可以在运行时重新调整应用程序的大小 ,从而有效地匹配DPI中的更改。 最终的结果是,不仅应用程序Per-DPI了解清晰,而且在各种尺寸的大型和小型显示器之间切换时,应用程序还会寻找用户在屏幕上更改相同的物理尺寸(以英寸或厘米为单位) 。 微软的Win32代码的缺点是它不能与Windows 7向后兼容。试图在7中运行导致应用程序崩溃。 我已经阅读了Dr.Dobbs上的这篇文章 ,Kenny Karr也阅读了这篇文章,但是不明白这些API是否足以让事情发挥作用。 有谁知道有一种方法可以做类似于微软的代码,在Windows 8.1和更新的版本中,每个监视器感知的应用程序在显示器之间移动时实际上会改变大小 ,但是在Windows 7中以系统感知的方式运行?

WPF:如何在对话单元中指定单位?

我想弄清楚如何使用适当的对话单元 (DLUs)在WPF中布局一个简单的对话框。 什么是对话单元? 对话框是基于用户首选字体大小的度量单位。 一个对话单元定义为平均字符宽度为4个对话单位,高8个对话单位: 这意味着对话单元: 改变选定的字体 更改为选定的DPI设置 不是方的 我花了大约两个小时从Windows Vista中select这个示例对话框,并使用各种dlu测量。 有人可以给出产生这个对话框的相应的XAML标记吗? 替代文字http://i44.tinypic.com/30a7390.jpg ( 图片链接 ) 无可否认,我对WPF XAML几乎一无所知。 每当我开始时,我都会因为无法弄清楚如何放置任何控制而受到阻碍。 似乎WPF中的一切都必须包含在某种types的面板中。 有StackPanels,FlowPanels,DockPanel, 网格等,如果你没有其中之一,那么它不会编译。 到目前为止,我唯一能够想到的XAML(使用XAMLPad): <DockPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Image Width="23" /> <Label>Are you sure you want to move this file to the Recycle Bin?</Label> <Image Width="60" /> <Label>117__6.jpg</Label> <Label>Type: ACDSee JPG Image</Label> <Label>Rating: Unrated</Label> <Label>Dimensions: 1072 × […]

如何检测用户的字体(DPI)是设置为小,大还是其他?

我需要找出是否用户的屏幕设置为正常的96 dpi(小尺寸),大120 dpi的字体,或其他东西。 如何在VB.NET(首选)或C#中做到这一点?

在Windows 8上声明每个窗口的高DPI认知度

我正在开发在Cubase等主机上运行的audio插件,我正在寻求增加高DPI支持。 这是有问题的,因为我知道的所有主机应用程序都声明自己的DPI是非高的,所以所有的窗口都由DWM自动缩放。 我正在寻找一种方法来closures插件窗口的DWM DPI缩放,即使主机本身不支持DPI(所以它使用所有其他窗口的DWM DPI缩放)。 有谁知道这是可能的吗? 对于使用大量插件(如audio主机)的应用程序来说,这是一个非常现实的问题,因为他们不能直接宣称自己的DPI意识很高:这会破坏所有现有的插件。 所以除非Windows为此提供解决scheme,否则我们总是被困在96 dpi的土地上。 基本上我认为我们需要一个比设置每个进程更细粒度的解决scheme,因此主机和插件可以单独声明他们的感知级别。 如果目前无法完成,是否有办法与Microsoft工程师联系,以便将其添加到未来版本的Windows中?