在某些情况下,虽然在高DPI的设置下DuiLib能正常的缩放,但是缩放后的显示效果很不好,文字图片显示模糊,影响用户体验,经过多次试验,解决办法如下:
在工程文件设置中,对相应工程做属性设置:
一
在工程->属性->清单工具->输入和输出->附加清单文件,在此配置项中选择相应的清单文件,清单文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<!-- Windows 6.0 Style -->
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*"></assemblyIdentity>
</dependentAssembly>
</dependency>
<!-- Administrator -->
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker"></requestedExecutionLevel>
</requestedPrivileges>
</security>
</trustInfo>
<!-- DPI Aware -->
<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>
<!-- OSVersion -->
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
<!-- Windows 8.1/Windows Blue/Server 2012 R2 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!-- Windows Vista/Server 2008 -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!-- Windows 7/Server 2008 R2 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!-- Windows 8/Server 2012 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
</application>
</compatibility>
</assembly>
其中requestedExecutionLevel 对应 工程->属性->连接器->清单文件->UAC执行级别,这两项需要相同,不然链接不通过;
dpiAware对应是否自动适配DPI,true为自动适配。
二
以上配置设置完成后,在代码中,需要对每个单独的窗体(WindowImplBase)设置相应的DPI,代码如下:
m_pm.SetDPI(CDPI::GetMainMonitorDPI());
三
关于图片资源的配置,在高DPI设置下,DuiLib会自动加载相应DPI缩放比例的图片资源,如:normalimage=“file=‘image\login_normal.png’”,在150缩放比的DPI设置下,资源自动加载image\[email protected],如果资源中没有该文件,则资源无法正常加载,显示为空白。ui文件(xml)无需做额外修改,只需在资源文件中放入相应命名规则的文件即可
四
在高DPI情况下,带有衍生窗体的控件(如combo),在xml中不能指定衍生窗体的大小。
比如,如果设置了combo控件的dropboxsize,则在计算下拉框大小时,会直接使用该大小,而略去高DPI的缩放,导致下拉框大小显示错误