翻遍了论坛所有有关dpi缩放的帖子,解决方法很多,有引入第三方dpi缩放模块的,我所有模块都试过了,要么是必须在程序初始指定缩放比例,不能响应系统设置的dpi缩放,例如这个DPI适应_精易论坛,要么就是能响应系统设置的dpi缩放,但部分组件有问题,超级列表框高度变低,菜单栏图标高度变低,例如这个QSSmartScale 自动界面缩放+完整字体缩放 完整DPI支持_精易论坛,引入模块的方法始终是不完美的。其中还有别的方法,就是给应用程序的属性设置高DPIdpi缩放行为为“系统(增强)”
这种方法固然有效,但你不能每次都手动设置吧,而且只要移动位置或者改名就得重新设置,发给别人用也得重新设置,这其实是在系统有关dpi缩放的注册表添加了一个文件路径,告诉系统以“系统(增强)”的方式缩放程序,因此呢还有人,在程序开始的时候自动写入注册表,程序结束的时候自动删除注册表,嗯...感觉有点不必要,频繁操作注册表实在不是明智行为。
论坛也有不少设置存根清单的帖子,但设置完都是禁用dpi缩放了,清晰是清晰了,但也窗口变小了,大小也不能跟系统缩放了,这样不同屏幕适应性太差。
然后我研究了一下微软官方的文档,得出一个结论
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2, system</dpiAwareness>
<gdiScaling xmlns="http://schemas.microsoft.com/SMI/2017/WindowsSettings">true</gdiScaling>
</windowsSettings>
存根清单里的这个<windowsSettings>部分是关于DPI缩放设置的,第一条<dpiAware>是在较旧的系统上win8.1之前的系统上启用dpi感知,<dpiAwareness> 在win8.1之后的系统上启用dpi感知,
但是易语言程序过于古老,当初设计不支持高DPI,仅启用这两行是不够的,微软为了不支持高dpi的程序提供了一个“系统(增强)”的设置,那就是第三条<gdiScaling>,设置了这一条后,编译后的程序自带“系统(增强)”属性,不用再手动设置,或者用其他软件设置。
附上一个完整的存根清单,设置了这个即可支持高分辨率屏幕dpi缩放且不模糊。
[XML] 纯文本查看 复制代码 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<application>
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2, system</dpiAwareness>
<gdiScaling xmlns="http://schemas.microsoft.com/SMI/2017/WindowsSettings">true</gdiScaling>
</windowsSettings>
</application>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="x86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!--Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!--Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!--Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!-- Windows 10, Windows 11 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
</application>
</compatibility>
</assembly> |