在win8上发布StretchDIBits以在IE10中烧毁无窗口窗口

时间:2013-06-25 06:10:07

标签: windows-8 activex internet-explorer-11 internet-explorer-10 firebreath

我使用Firebreath创建一个跨浏览器插件来进行3D图形渲染。

实际绘图在我的本机代码中发生在屏幕外目标上,每次刷新都会调用myplugin :: onWindowRefresh,这将StretchBlt调用到无窗口的插件窗口,代码如下,

FB::PluginWindowlessWin *win = dynamic_cast<FB::PluginWindowlessWin*>(pluginWindow);
dstHdc = win->getHDC();
if(srcDib && dstHdc)
{
  FB::Rect r = win->getWindowPosition();
  int dstWidth = r.right - r.left; 
  int dstHeight = r.bottom - r.top;

  SetStretchBltMode(dstHdc, HALFTONE);
  StretchDIBits(dstHdc, r.left, r.top, dstWidth, dstHeight, 0, 0, srcWidth, srcHeight,
  srcDib->GetBits(), srcDib->GetBitmapInfo(), DIB_RGB_COLORS, SRCCOPY);
}

在IE10中尝试使用win8插件之前,一切正常。问题是

从无窗口窗口获取的窗口位置不再是窗口位置,它的行为类似于插件位置,这意味着无窗口插件的目标HDC位于插件空间中坐标,但在其他情况下(IE9,chrome,firefox等),它是窗口空间坐标。

那么,在win8或firebreath问题上IE10是一个问题吗? 任何帮助/建议表示赞赏。

更新 该问题仅发生在win8上的IE10中。我刚刚在win7上安装了IE10,我的插件运行良好。

1 个答案:

答案 0 :(得分:2)

原来解决这个问题的方法是使用RefreshEvent中的边界而不是getWindowPosition。

FB::Rect r = dynamic_cast<FB::RefreshEvent*>(evt)->bounds;

这可能会解决您的问题。

相关问题