- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在我运行 Win7 的笔记本电脑上,当我将显示设置设置为 125% 时,DPI 显示为 120(同时使用 graphics.DpiX 和 GetDeviceCaps)。但是,在显示为 150% 时,DPI 为 96(?!),就像在 100% 时一样。有谁知道 a) 为什么会这样,b) 除了检查 DPI 以检测显示是否设置为 100% 以外的任何其他方式之外,还有其他方法吗?我正在编写一个应用程序,我想在显示设置为 >= 150% 时显示一条消息。
谢谢。
最佳答案
我刚刚遇到了同样的问题,尽管 StackOverflow 上有很多与 DPI 相关的问题,但我并没有在一个地方找到所有答案。
问题 a) 的答案比较简单:从 Windows Vista 开始,Windows 支持两种与 DPI 相关的调整大小。如果您在显示设置上单击“设置自定义文本大小 (DPI)”,您会看到默认情况下,125% 使用与 Windows XP 兼容的调整大小,而 150% 则不使用。
问题 b) 比较棘手。如果您搜索 StackOverflow,通常您可以找到以下答案:
using (Graphics screen = Graphics.FromHwnd(IntPtr.Zero))
{
IntPtr hdc = screen.GetHdc();
int dpiX = GetDeviceCaps(hdc, DeviceCaps.LOGPIXELSX);
screen.ReleaseHdc(hdc);
}
但是,无论实际 DPI 设置如何,它都会始终返回 96,除非......
- 您使用 Windows XP 或在 DPI 设置中检查了兼容模式。 问题:您无法对用户强制执行。
- DWM 已关闭(您使用基本或经典主题)。 问题:同上。
- 你调用SetProcessDPIAware使用 GetDeviceCaps 之前的功能。 问题:这个函数应该在所有其他渲染之前被调用一次。如果你有一个现有的 DPI-unaware 应用程序,改变意识会破坏整个外观。函数调用后无法关闭。
- 你调用SetProcessDpiAwareness使用 GetDeviceCaps 之前和之后。 问题:此功能至少需要Windows 8.1
似乎GetDeviceCaps function MSDN 上没有完整记录。至少我发现pinvoke.net提到了该函数可以获得的一些其他选项。最后我提出了以下解决方案:
public static int GetSystemDpi()
{
using (Graphics screen = Graphics.FromHwnd(IntPtr.Zero))
{
IntPtr hdc = screen.GetHdc();
int virtualWidth = GetDeviceCaps(hdc, DeviceCaps.HORZRES);
int physicalWidth = GetDeviceCaps(hdc, DeviceCaps.DESKTOPHORZRES);
screen.ReleaseHdc(hdc);
return (int)(96f * physicalWidth / virtualWidth);
}
}
以及所需的附加代码:
private enum DeviceCaps
{
/// <summary>
/// Logical pixels inch in X
/// </summary>
LOGPIXELSX = 88,
/// <summary>
/// Horizontal width in pixels
/// </summary>
HORZRES = 8,
/// <summary>
/// Horizontal width of entire desktop in pixels
/// </summary>
DESKTOPHORZRES = 118
}
/// <summary>
/// Retrieves device-specific information for the specified device.
/// </summary>
/// <param name="hdc">A handle to the DC.</param>
/// <param name="nIndex">The item to be returned.</param>
[DllImport("gdi32.dll")]
private static extern int GetDeviceCaps(IntPtr hdc, DeviceCaps nIndex);
关于Windows 显示设置为 150% 时仍显示 96 DPI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7003316/
我 Handlebars 机图片尺寸调整为731*974,但还是有920KB。所以我想将图像分辨率从96dpi更改为72dpi(因为我发现iPhone中的图片是72dpi,看起来不错)。任何人都可以提
我制作了这个非常简单的计算器布局。但是我手机上的 480 DPI 和 420 DPI 是不同的。 420DPI 屏幕右侧有空闲空间,按钮比 480DPI 更细。我使用 dp 作为按钮的测量单位,sp
使用 phantomjs ,有没有办法控制使用 page.render(filename) 光栅化 Web 内容的图像时使用的 DPI 设置?方法? 我找不到任何可以通过 the interface
众所周知,Windows 7 可用的 DPI 缩放比例为 100%、125%、150% 和 200%。这四个DPI百分比的实际DPI值是 Percentage - DPI Values 100%
我试图找到 WinMerge 的替代方案来解决 150% DPI 下的文本模糊问题。虽然我的问题被关闭了(我认为这种心态没有帮助),但我找到了答案所以我分享它。 最佳答案 您可以继续使用 WinMer
我有一些我想打印出来的图像。这些图像可以采用不同的格式,从不同的 DPI 到不同的格式(JPEG、PNG 等) 现在我所做的是将图像加载到我的应用程序中并尝试 将 dpi 转换为 96。但是在这个过程
DPI 和 PPI 有什么区别吗?是这样吗:点 = 像素?最后,C#.net 中的 DpiX 和 DpiY 是什么?我们如何改变它们? 最佳答案 新闻部 代表每英寸点数,在打印时使用。它也被严重滥用于
我有一个可视化代码,例如: for cluster in ready_couples_2.cluster.unique(): sns.set(rc={'figure.figsize':(11.
我正在努力优化我的网络应用程序中的滚动性能,并在最新的 Chrome (v31) 上遇到了有趣的行为,该行为也在 Chrome Canary (v34) 上重现。 在这个简化的示例中,我有一个简单的可
我正在构建一个具有 hdpi 分辨率图形 Assets 的游戏(因此我将文件放在 drawable-hdpi 目录中)。我不希望图像具有相应的 mdpi 分辨率,我将在基于 240-dpi 的像素坐标
我必须重新布局一个非常复杂的 UI,因为我们发现它在高 dpi 系统上基本上不可用。这是因为为了在 Qt Creator 中获得我们想要的布局设计,我们对几乎所有内容都使用了固定大小。 我的问题是,如
我的系统上安装了 Win 8.1 系统。我曾经根据我的 WPF 应用程序 (Win 7) 中的以下内容计算 DPI: Matrix m = PresentationSource.FromVisual(
我有一个使用 Substance LookAndFeel 的 Java 应用程序,Windows 作为目标平台,我想增加我的应用程序的 DPI 设置, 不更改系统设置。 我想这样做是因为我不想强制用户
我有一个非常奇怪的问题......在我的 iPhone 应用程序中,用户可以打开相机胶卷中的图像,在我的示例中 1920 x 1080 像素 (72 dpi) 的壁纸。 现在,想要将图像的宽度调整为例
我遇到一个问题,应用程序(用 Delphi 编写)在所有系统上的默认 96 DPI 设置下表现正常,但在不同系统上的“150% 文本大小”(内部 144 dpi)设置下表现不一致。似乎在某些系统上,我
我看过官方Qt documentation以及 StackOverflow 上关于 Qt 中高 DPI 支持的许多文章和问题。他们都专注于移植旧的应用程序并让它们以尽可能少的更改工作。 但是,如果我要
在matplotlib中,我使用LineCollection绘制国家/地区的颜色,并指定了县/市的边界。当我将图形另存为pdf文件时: fig.savefig('filename.pdf',dpi=3
我想以编程方式确定用户显示器的 DPI,以便以精确的单位数(厘米/英寸)显示网页。我知道这是一个奇怪的要求:它是针对一个可视化研究项目的,它是一种控制。我们目前通过让用户将信用卡放在屏幕上并将可调整大
我使用 matplotlib 创建了一个图形,但我已经意识到绘图轴和绘制的线被缩小了。 阅读本文 earlier discussion thread ,它解释了如何设置图形大小。 fig, ax =
晚安,我正在与一些合作伙伴使用 javaFx 制作一个应用程序;我们的想法是它将在 Windows 和 Linux 中使用。我们进行了一些测试,发现应用程序在两种操作系统中的显示有所不同。 我们正在使
我是一名优秀的程序员,十分优秀!