首页 > 代码库 > CEF3开发者系列之CefEnableHighDPISupport详解

CEF3开发者系列之CefEnableHighDPISupport详解

在CEF3中,CefEnableHighDPISupport()这个接口函数在使用时一般不为人所注意,但是如果稍有不慎,会造成打开的网页不能填满窗口的问题。如果是需要flash插件才能运行的游戏。则会出现打开游戏后,调整窗口大小时,发现游戏界面的大小并未随之改变,而且游戏里的点击位置却与界面显示的位置也不对应。

是什么原因出现这种情况呢?先来看看CefEnableHighDPISupport()这个接口函数是干什么用的。cef_app.h中,如下所说。

///
// Call during process startup to enable High-DPI support on Windows 7 or newer.
// Older versions of Windows should be left DPI-unaware because they do not
// support DirectWrite and GDI fonts are kerned very badly.
///
/*--cef(capi_name=cef_enable_highdpi_support)--*/
void CefEnableHighDPISupport();

 在进程启动时设置windows7或者更好版本的High-DPI为启用状态。而低版本的windows系统对DirectWrite和DPI支持不好(设置这个不会有什么作用)。

什么DPI? 全称是dots per inch (DPI), 也就是每英寸的点数,在显示器上就是每英寸的像素个数,Window上一般默认是96 dpi 作为100% 的缩放比率, 但是要注意的是该值未必是真正的显示器物理值, 只是Windows里我们的一个参考标准。(详细参见:关于Windows高DPI的一些简单总结)。

如果设置了对高DPI的支持,但是打开网页时,没有设置相应的缩放比例,那么在win7以上版本里,很容易出现文章开头所说的问题。解决这个问题很简单,要么不要使用CefEnableHighDPISupport()这个接口函数,要么去设置网页的缩放比例。

设置网页的缩放大小使用SetZoomLevel(double zoomLevel)这个函数,如下所示:
  ///
  // Change the zoom level to the specified value. Specify 0.0 to reset the
  // zoom level. If called on the UI thread the change will be applied
  // immediately. Otherwise, the change will be applied asynchronously on the
  // UI thread.
  ///
  /*--cef()--*/
  virtual void SetZoomLevel(double zoomLevel) =0;

在执行渲染之前,在UI线程中,使用这个函数重置缩放比例,可以立即生效。

CEF3开发者系列之CefEnableHighDPISupport详解