ActiveXコントロールがIE9のCreateSurfacePresenterを呼び出して、 ISurfacePresenterインターフェイスを取得します。
これを使用して、IE9(またはそれ以降)のブラウザーで公開されているd3dサーフェスにレンダリングし、
ハードウェアアクセラレーションによるオーバーレイブレンディングを実現します。
いくつかのコード:
CComQIPtr<IViewObjectPresentNotifySite, &IID_IViewObjectPresentNotifySite> m_spIViewObjectPresentSite;
ISurfacePresenter* m_spISurfacePresenter;
HRESULT hr = m_serviceProvider->QueryInterface(IID_IViewObjectPresentSite, (void **) &m_spIViewObjectPresentSite);
if(FAILED(hr))
return -1;
// ... later...
m_numBuffers=1; // or 2 doesn't matter
hr = m_spIViewObjectPresentSite->CreateSurfacePresenter(
m_partialScreenD3dDevice, window_width, window_height, m_numBuffers, DXGI_FORMAT_B8G8R8A8_UNORM, VIEW_OBJECT_ALPHA_MODE_IGNORE, &m_spISurfacePresenter);
// !!! this call works for activeX plugin hosted in IE9 browser, but fails (Invalid Argument)
// when hosted in a hosted IE webBrowser control (same html)
これはIE9ブラウザで動作します。
ただし、埋め込まれたIE ActiveXコントロールで機能する必要があります
。IE9WebBrowserコントロールをWindowsフォームまたは別のブラウザーに
埋め込み、wbコントロールをActiveXコントロールを埋め込んだhtmlページに移動します。
ただし、その場合、CreateSurfacePresenterの呼び出しは失敗し、無効な引数エラーが発生します。
IEコントロールがISurfacePresenterを返さないのはなぜですか?
注:
1)IE WebBrowserコントロールはウィンドウプラグインであり、ActiveXはウィンドウレスです。2)埋め込まれたWebBrowserがIE9モードで読み込まれる
ことを確認します(JSからUserAgentを読み取ります)
3)direct3d9exを使用してレンダリングします