CEF在Windows系统高DPI适配

DPI全称是dots per inch,也就是每英寸的点数,在显示器上就是每英寸的像素个数,Window上一般默认是96 dpi作为100% 的缩放比率。Windows系统的DPI特性对于传统的vc++ GUI开发来说简直是灾难。在高分辨率的显示器上,不启用高DPI支持,界面上的元素和文字小的要死。启用高DPI支持,界面又模糊的一塌糊涂。如下图所示,分别是100%和150%时Win10上的效果,100%显示效果更好更锐利,而150%效果看着发虚。高分辨率显示器的本意就像Mac OS的retina屏幕那样使UI显示的更加细腻,结果微软弄巧成拙,搞的里外不是人。

CEF的DPI显示效果与DPI设置、--no-sandbox、--disable-gpu三者有关。最佳的实践是:

这里有几个细节。

根据CEF官方的例子,默认在程序的最开始调用CefEnableHighDPISupport函数,在有沙箱的情况下这个函数对render进程不生效,这是符合预期的。如果使用了--no-sandbox参数,则需要注意render进程的DPI设置,请确保是PROCESS_DPI_UNAWARE。

CefEnableHighDPISupport函数会设置DPI为PROCESS_SYSTEM_DPI_AWARE,这个并不是最优的DPI显示效果设置。最好改内核代码设置成PROCESS_PER_MONITOR_DPI_AWARE并重新编译。

参考: