问题标签 [highdpi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
6777 浏览

.net - 支持 DPI 和默认字体更改

因此,我试图弄清楚 Form 的 AutoScaleMode 属性如何可能有助于支持具有与我的工作开发机器不同的字体或DPI的系统。

从 SDK:

AutoScaleMode 枚举

公共枚举 AutoScaleMode

默认情况下,.NET 2.0 表单使用 AutoScaleMode.Font。

所以我在我的 Windows XP、Tahoma 8 pt、96 DPI 开发机器上设计了一个示例表单。然后我试了一下

  • 14 pt Segoe UI 96 DPI 机器
  • 14 pt Segoe UI 150 DPI 机器

结果并不令人鼓舞,如您在此屏幕截图中所见:

AutoScaleMode 属性并非旨在启用 .NET 窗体以支持不同的字体或 DPI 设置。那么支持不同字体和 DPI 设置的正确方法是什么?

0 投票
1 回答
4936 浏览

.net - Graphics.MeasureString 返回与 Win32 GetTextExtent 不同的值

我一直在尝试在 C# 中找到一种方法来测量字符串的大小。在 Win32 中测量字符串的标准方法是使用 GetTextExtent。真正的目标是找到字体字符的平均宽度和高度。查找字符平均宽度的标准方法是从获取所有字母字符的宽度并除以 52 开始:

Microsoft 有一个页面列出了某些 DPI 设置下某些字体大小的平均字符宽度,我已经通过我自己对 GetTextExtent 的调用确认了它们。

  • 塔荷马 8pt, 96dpi: 13x6 像素
  • 塔霍马 9pt,96dpi: 14x7 像素
  • Segoe UI 9pt,96dpi:15x7 像素

现在我想在 .NET WinForms 下执行相同的计算。使用 Graphics.MeasureString() 我想出了代码:

不幸的是,这些值与已知的、可接受的真实值不匹配:

  • Tahoma 8pt,96dpi: 14x6 像素(14.21x6.09 像素)
  • Tahoma 9pt,96dpi: 16x7 像素(15.98x6.85 像素)
  • Segoe UI 9pt,96dpi: 17x7 像素(17.46x6.91 像素)

平均字符宽度结果还可以,但字符高度太大了约 13%。我假设额外的高度是由于高度分类的差异已更改为包括上升者和下降者。如果测量字符串太高,我尝试将其更改为:

认为现在字符串没有那么高,所以测量的高度应该更短。不,它返回的高度与包含上升器和下降器的字符串版本完全相同(尽管平均宽度稍大一些)。

这可能是什么原因,并且可以获得平均字符高度可以对平均文本高度做什么,使其与 GetTextExtent 返回的可接受值匹配?

注意:尽管获取平均字符高度的标准做法是使用 GetTextMetrics,但 GetTextExtents 返回的高度返回相同的值。

0 投票
1 回答
669 浏览

.net - 在 120dpi 下调试 .NET WinForms 应用程序

我目前使用 VMware 虚拟机 (Windows XP) 在 120dpi 下调试我的 .NET WinForms 应用程序。很烦人。

有人知道在我的 96dpi 工作环境下给我类似结果的方法吗?也就是单个进程可以开启120dpi模式,还是Windows Forms里面有开关?

0 投票
5 回答
6481 浏览

windows - Windows:如何在高 dpi 下测试 UI?

我想测试我的应用程序对dpi 设置的反应。我不只是指 120dpi。我想测试更高的 dpi 设置,例如:

  • 150dpi
  • 300dpi
  • 600dpi
  • 1000dpi
  • 1200dpi

我的开发机器的显卡无法达到 300dpi(甚至 150dpi)所需的分辨率。

假设界面设计为“适合”在具有 768 行(例如 1024x768)的显示器上,更高 dpi 设置所需的分辨率为:

即使在 150dpi 时,所需的分辨率也会非常高。

我正在考虑在VirtualPC上运行软件,虚拟机运行6400x4800 - 然后使用VNC连接到虚拟机。然后它可以缩放内容以适合我的显示器。虽然我失去了高 dpi 显示器的保真度,但我至少可以看到它,与之交互(即测试它)。但是 VirtualPC 模拟的 s3 Trio 32/64 视频卡的最高分辨率为1600x1200(即 150dpi)。

我还想知道是否有一些虚拟视频卡驱动程序可以像视频卡一样工作 - 具有高分辨率,但在我的本机桌面上显示自身。

有任何想法吗?


参考

0 投票
7 回答
38297 浏览

windows - 如何为我的 Windows 应用程序创建高质量的图标?

如果您正在运行具有更高 DPI 设置的 Windows,您会注意到桌面上的大多数应用程序图标看起来很糟糕。甚至一些高调的应用程序图标(例如 Google Chrome)看起来很糟糕,而 Firefox、Skype 和 MS Office 图标看起来很清晰:

一个非常模糊的图标旁边的超级清晰的图标

(例子)

我怀疑大多数图标看起来很模糊,因为较低分辨率的图标被放大而不是使用更高分辨率的图标。

我想给我的应用程序一个高质量的图标,但似乎无法说服 Windows 使用更高分辨率的图标。我用图标编辑器IcoFX创建了一个多分辨率图标。该图标以16x16、24x24、32x32、48x48、128x128 和 256x256(!)(全部为 32 位,包括 alpha 通道)提供,但 Windows 似乎在桌面上使用 48x48 版本的图标并将其放大,这看起来很糟糕。(我使用的是 Windows 7 - 64 位 - 通过在 msi 中设置快捷方式(通过 Visual Studio 2008 安装项目创建)并将其指向包含多分辨率图标的 .ico 文件来放置图标)

我曾尝试删除 128x128 图标,但无济于事。有趣的是,在 Windows 资源管理器中,即使使用超大图标设置,图标看起来也很棒。如何在 Windows 上创建一个在更高 DPI 设置下看起来很棒的高质量桌面图标?

编辑:我测试了删除 128x128 选项,然后是 48x48 和 128x128 选项,并尝试使用 Axialis IconWorkshop 创建图标 - 没有任何效果。

编辑:经过多次试验和错误,我认为这里真正的问题是 Visual Studio 2008 安装项目 - 手动设置指向我的可执行文件的链接正确使用高分辨率图标,但是由安装程序创建的链接不使用正确的图标。在编辑器中设置链接的图标时,它只给了我一个选项(索引 0),它似乎是 48x48 图标。我尝试手动调整 .vdproj 中的 IconIndex 但没有运气。

0 投票
2 回答
17434 浏览

android - How do I get the WVGA Android browser to stop scaling my images?

I'm designing an HTML page for display in Android browsers. Consider this simple example page:

It looks just fine on the standard HVGA phones (320x480), but on HDPI WVGA sizes (480x800 or 480x854) the built-in browser automatically scales the image up; it looks ugly.

I've read that I should be able to use this tag to force the browser to stop scaling my page:

... but all that does is disable user scaling (the zoom buttons disappear); it doesn't actually prevent the browser from scaling my image. Adjusting the scale factors (setting them all to 2.0 or 0.5) has no effect at all.

How can I force the WVGA browser to stop scaling my images?

0 投票
4 回答
8251 浏览

android - 如何区分android中的480X800和480X854屏幕?

如何区分 480X800 和 480X854 屏幕。我们可以选择将一个图像放在 hdpi 文件夹中。在我的情况下,480X800 图像不支持 480X854 图像。它在底部显示一个空白区域。任何想法?

编辑:我将图像设置为背景。在我的布局上,我有带边距的透明图像视图。如果我单击图像视图,它会执行一些任务。但在这两个屏幕之间。我可以调整一个值。在另一个中,图像略微拉伸。那我该怎么办?你能理解我的问题吗?请帮忙。

0 投票
1 回答
3171 浏览

c++ - 以编程方式确定 Windows DPI 设置?

我们的一个不支持 dpi 的 MFC 应用程序有问题。
如果您将系统设置更改为高 dpi(例如 120 或 144 dpi),则任务栏上的应用程序图标看起来很糟糕。不幸的是,我们必须WNDCLASS为大型机注册我们自己的,并且WNDCLASS.hIcon您必须在会员中设置一个图标。LoadIcon该图标是使用该功能加载的。并且该函数尝试以标准尺寸加载图像(与返回的相同GetSystemMetrics(SM_CXICON)),对于 120dpi 来说,它是 40x40 像素。这很不幸,因为我们不提供该尺寸的图标。但是有一个解决方法:奇怪的是,dpi 虚拟化似乎对 120 dpi 无效,GetDeviceCaps(..., LOGPIXELSX)确实返回 120 dpi 并且GetSystemMetrics(SM_CXICON)返回 40。所以我们可以抓住它并以不同的大小加载图标。但是对于 144 dpi 它不起作用,因为现在虚拟化似乎生效了,我们得到 96 dpi 和 32 像素,这再次导致图标看起来非常难看。
我发现如果我只是将WNDCLASS.hIcon成员设置为NULL,图标就会显示得很好。但我想知道这是否可以,因为根据 MSDN:

hIcon
类图标的句柄。此成员必须是图标资源的句柄。如果此成员为 NULL,则系统提供默认图标。

那么即使我将该成员设置为NULL,我是否可以指望始终显示的图标?另一种方法是以正确的大小加载图标,但为此我必须知道系统实际上设置为 144 dpi。我的第一个问题就到这里了。有谁知道是否可以确定系统的 DPI 设置(从 dpi 虚拟化应用程序中)?请注意,我还考虑过做一些肮脏的事情,比如让一个 dpi 感知应用程序告诉我实际的 dpi 和类似的东西,但如果可能的话,我想避免这样的事情。

最好的祝福,

洪巴贡巴

更新:
我发现将WNDCLASS.hIcon成员设置NULL为不是一个好主意,因为随后大型机的图标被默认图标替换(即使它在任务栏上看起来很好......) - 我没有注意到在我的第一次测试。

0 投票
4 回答
11350 浏览

delphi - 在 Windows Vista 和 Windows 7 中对 DPI 虚拟化和 DPI 感知应用程序进行故障排除

我有一个问题,即应用程序(用 Delphi 编写)在所有系统上的默认 96 DPI 设置下表现正常,但在不同系统上的“150% 文本大小”(内部 144 dpi)设置下表现不一致。似乎在某些系统上,我的应用程序的某些文本/字体部分正在被拉伸,而在其他系统上,它们不是。我会认为我的应用程序,在某个版本的 Windows (Win7) 上,在某个 DPI 上,应该以相同的方式运行。

我的应用程序要么让 Windows 知道它不需要 DPI 虚拟化功能,要么不需要。我就这么理解。我不明白的是,DPI 变化如何导致两台机器上出现不同的外观,两台机器都运行 Windows 7,都是 144 dpi,以相同的固定大小显示相同的字体和表单。

我需要在 Windows(注册表等)中检查 DPI 虚拟化中涉及的一些与配置相关的元素吗?否则,您如何排除故障并知道是否在您的客户端窗口上进行了 DPI 虚拟化?

在 Delphi 中,如果不想缩放,则必须将 TForm.Scaled 属性设置为 false。但我不明白的是,当主窗体的 Scaled 属性为真时,我不能总是预测结果。

在我的应用程序中最令我困惑的是,我有一个控件,它只会在我的大型实际应用程序中出现异常,但在我尝试仅调试控件的独立应用程序中不会出现异常。为了理解独立应用程序中的控制行为,我被迫制作了一个演示应用程序,我通过清单文件强制 DPI 感知。然后我可以重现控制绘图故障,尽管形式不同。

这是我在演示应用程序中使用的清单文件,它暴露了我的控件在处理 Windows 中的高 dpi 设置时遇到的问题。但是,我发现的一件奇怪的事情是应用程序可以

这是当我在我的应用程序中禁用 DPI 虚拟化时,我的应用程序中的控件被弄乱的大约 30 个地方之一的示例。通过在我的表单中关闭 Scaled 属性解决了这个特殊的故障。但在其他地方,有 TForm.Scaled=false 会导致问题,而在某些形式中,它可以解决它:

具有非 DPI 虚拟化应用程序清单的 DPI 故障示例,但主要形式是 Scaled

更新:事实证明,我的某些控件使用 GDI+,并且 GDI+ 上下文中的字体行为与普通 GDI 上下文中的字体行为不同,至少对于某些使用 GDI+ 的第三方控件而言。这是头痛的主要来源。其次,对于 DPI 意识,VCL 中存在参差不齐的测试覆盖率和定义不明确的要求。一些 VCL 控件基于 MS 通用控件,虽然可以公平地说底层的通用控件在高 DPI 情况下可能工作正常,但并非所有 VCL 控件包装器都能保证正常工作。因此,检查应用程序在其所有控件中的高 DPI 意识,以及所有可用 Windows 7 主题中的正确行为:

  1. aero glass on,96dpi(大多数现代硬件上的默认 Win7 外观)
  2. 基本主题(航空玻璃关闭)但启用了 xp 主题
  3. 经典的win2000外观玻璃关闭,以及xp级别的主题,
  4. 高对比度白色
  5. 高对比度黑色
  6. 各种非 96 DPI 设置

..而且不胜枚举。作为应用程序开发人员,您的负担相当沉重。无论您是使用 VCL 的 delphi 用户,还是 MFC/ATL C++ 开发人员,在我看来,支持所有各种古怪的 windows 模式几乎是一个难以承受的负担。所以大多数人都不会打扰。我对吗?

0 投票
3 回答
7348 浏览

wpf - 如何防止 WPF 使用 Windows 字体大小选项进行缩放?

我不希望我的 WPF GUI 使用 Windows 字体大小选项 (DPI) 进行缩放。这不仅仅是在 UserControl 上指定固定字体大小的问题,因为缩放会影响 UserControl 中的图像和边框。我可以在 UserControl 上设置一个属性来关闭缩放吗?如果没有,我该怎么做?