如果您运行的是具有更高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,但没有运气.
所以我试图弄清楚Form的AutoScaleMode属性如何可能有助于支持具有与我的工作开发机器不同的字体或DPI的系统.
从SDK:
AutoScaleMode枚举
public enum AutoScaleMode
None Automatic scaling is disabled. Font Controls scale relative to the dimensions of the font the classes are using, which is typically the system font. Dpi Controls scale relative to the display resolution. Common resolutions are 96 and 120 DPI.
默认情况下,.NET 2.0 Forms使用AutoScaleMode.Font.
所以我在我的Windows XP,Tahoma 8 pt,96 DPI开发机器上设计了一个样本表单.然后我试了一下
结果并不令人鼓舞,您可以在此屏幕截图中看到:
AutoScaleMode属性未设计为启用.NET窗体以支持不同的字体或DPI设置.那么支持不同字体和DPI设置的正确方法是什么?
带有3200X1800联想笔记本电脑的Windows 8上的jmeter UI无法使用.最左侧窗格中的字体太小,而右侧的行间距对于字体而言太小.如果我将分辨率更改为1920X1080,则无效.尝试在1920X1080的第二台显示器上使用.没运气.系统设置为大尺寸.似乎无法交换哪个显示器是主要的.任何人解决这个?
我正在设计一个HTML页面,以便在Android浏览器中显示.考虑这个简单的示例页面:
<html>
<head><title>Simple!</title>
</head>
<body>
<p><img src="http://sstatic.net/so/img/logo.png"></p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
它在标准HVGA手机(320x480)上看起来很不错,但在HDPI WVGA尺寸(480x800或480x854)上,内置浏览器会自动缩放图像.它看起来很难看.
我已经读过,我应该可以使用此标记强制浏览器停止缩放页面:
<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; minimum-scale=1.0; user-scalable=0;" />
Run Code Online (Sandbox Code Playgroud)
...但所有这一切都是禁用用户缩放(缩放按钮消失); 它实际上并没有阻止浏览器缩放我的图像.调整比例因子(将它们全部设置为2.0或0.5)完全没有效果.
如何强制WVGA浏览器停止缩放图像?
我正在开发一台4k显示器,它很痛苦......
最后我设法建立了QtDesigner,然后发现了这个问题:
当您使用QT_AUTO_SCREEN_SCALE_FACTOR=1
并使用radiobutton和其他基本小部件编译应用程序时,它看起来在4k屏幕上缩放.否则控件的尺寸是正确的,正如预期的那样,它只是不锐利,而是像素化.
我使用Qt 5.6 RC msvc2015 64bit在4k屏幕上运行Windows 10 Home 64bit,使用200%DPI变焦,并尝试使用相同的结果
QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
Run Code Online (Sandbox Code Playgroud)
如果我使用
QGuiApplication::setAttribute(Qt::AA_DisableHighDpiScaling);
Run Code Online (Sandbox Code Playgroud)
控件很清晰,文字大小正常但是所有尺寸都要小得多.
如何在高DPI屏幕上进行控制?
我正在编写一个需要在高dpi Windows(192dpi而不是96dpi)上运行的Qt应用程序.
不幸的是Qt框架还没有支持high-dpi(至少在Windows上),所以我的应用程序及其所有元素看起来应该是它应该的一半.
有没有办法强制/模拟Windows自动升级此类应用程序?
我有一个问题,在所有系统上,应用程序(用Delphi编写)在默认的96 DPI设置下表现正常,但在不同系统上的"150%文本大小"(内部144 dpi)设置下表现不一致.似乎在某些系统上,我的应用程序的某些文本/字体部分正在被拉伸,而在其他系统上,它们不是.我原以为我的应用程序,在某个版本的Windows(Win7)上,在某个DPI下,应该表现得一样.
我的应用程序将使Windows知道它不需要DPI虚拟化功能,或者它不需要.我明白了.我不明白的是DPI更改如何在两台机器上产生不同的外观,两台机器都以144 dpi运行Windows 7,以相同的固定大小显示相同的字体和形式.
我需要在Windows(注册表等)中检查DPI虚拟化中是否涉及一些与配置相关的元素?否则,您如何排除故障并了解是否在客户端窗口上进行了DPI虚拟化?
在Delphi中,如果不想扩展,必须将TForm.Scaled属性设置为false.但我不明白的是,当主窗体的Scaled属性为真时,我无法总是预测结果.
在我的应用程序中,最令我困惑的是,我有一个控件只在我的大型实际应用程序中行为不端,但在我试图调试控件的独立应用程序中没有出错.为了理解独立应用程序中的控件行为,我被迫制作了一个演示应用程序,我通过清单文件强制进行DPI感知.然后我可以重现控制绘图故障,虽然是以不同的形式.
这是我在我的演示应用程序中使用的清单文件,它暴露了我的控件在处理windows中的高dpi设置时遇到的问题.但是,我发现一件奇怪的事情是应用程序是可能的
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<asmv3:windowsSettings
xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
<assemblyIdentity version="14.0.3615.26342" processorArchitecture="*"
name="TestProject" type="win32"></assemblyIdentity>
<description>High DPI Controls Test App</description>
</assembly>
Run Code Online (Sandbox Code Playgroud)
这是我在应用程序中禁用DPI虚拟化时,我的应用程序中的控件混乱的大约30个地方之一的示例.通过关闭我的表单中的Scaled属性来解决这个特殊的故障.但在其他地方,TForm.Scaled = false导致问题,而在某些形式,它修复它:
更新:事实证明我的一些控件使用GDI +并且GDI +上下文中的字体行为与普通GDI上下文中的字体行为不同,至少对于使用GDI +的某些第三方控件而言.这是头痛的主要原因.其次,对于VCL中的DPI感知,存在不稳定的测试覆盖率和不明确的要求.一些VCL控件基于MS公共控件,虽然公平地说底层公共控件在高DPI情况下可能正常工作,但并不是所有的VCL控件包装都能保证正常工作.因此,在所有控件中查看高DPI感知应用程序,以及所有可用Windows 7主题中的正确行为:
..并且列表继续.作为应用程序开发人员,你有一个相当沉重的负担.无论您是delphi用户还是使用VCL,或者您是MFC/ATL C++开发人员,在我看来,支持所有各种奇特的Windows模式是一种几乎无法承受的负担.所以大多数人都不打扰.我对吗?
我刚刚看到在IDEA 13.1 中有对Windows的HiDPI支持:
通过-Dis.hidpi = true支持Windows/Linux HiDPI设备
这究竟是什么意思?我该如何启用它?我应该在哪里设置这个标志?
我有一个高分辨率的显示器和更高的DPI字体会很好,这个设置会有帮助吗?如果是,我该如何利用它呢?
我需要能够将应用程序清单中的dpiAware属性设置为"每个监视器".属性中的可用选项仅用于启用或禁用DPI感知.这些设置都不适合我.如果我没有在exe中嵌入清单,那么我可以获得我想要的应用程序行为,然后手动编辑清单.我想自动生成并嵌入清单.有什么我想念的吗?(我使用的是Visual Studio 2013.)
我已经阅读了有关Qt中高DPI支持的StackOverflow上的官方Qt文档和许多文章和问题.所有这些都专注于移植旧应用程序并使它们尽可能少地进行更改.
但是如果我要开始一个全新的应用程序,打算支持每个监视器的DPI感知应用程序,最好的方法是什么?
如果我理解正确,Qt::AA_EnableHighDpiScaling
则与我想要的完全相反.我应该实际禁用HighDpiScaling并在运行时手动计算所有尺寸?
许多建议都表示不使用尺寸,使用浮动布局.但是在许多情况下,希望存在至少最小宽度和/或最小高度.由于Qt Designer只允许我将值放在绝对像素中,所以正确的方法是什么?如果显示器分辨率发生变化,我应该在何处放置代码重新计算尺寸?
或者我应该选择自动缩放?
在我尝试添加HighDPI支持的一个较旧的应用程序中,我使用了这种方法 - 列出DOM的所有子项,并在给定比例的情况下逐个调整它们的大小.Ratio = 1将产生与我在Qt Designer中指定的尺寸相等的尺寸.
void resizeWidgets(MyApp & qw, qreal mratio)
{
// ratio to calculate correct sizing
qreal mratio_bak = mratio;
if(MyApp::m_ratio != 0)
mratio /= MyApp::m_ratio;
// this all was done so that if its called 2 times with ratio = 2, total is not 4 but still just 2 (ratio is absolute)
MyApp::m_ratio = mratio_bak;
QLayout * ql = qw.layout();
if (ql == NULL)
return; …
Run Code Online (Sandbox Code Playgroud)