1

我使用 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上的IE10问题还是firebreath问题?任何帮助/建议表示赞赏。

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

4

1 回答 1

2

事实证明,解决此问题的方法是使用 RefreshEvent 中的边界而不是 getWindowPosition。

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

这可能会解决你的问题。

于 2014-01-22T05:33:11.667 回答