天天看点

d3d使用chrominum cef的简单实现

sdk官网

https://bitbucket.org/chromiumembedded/cef

https://cefbuilds.com/

版本2454,可在xp下正确运行(window7 vs2008下会导致crtdbg memory dump报不出,xp、win10下正常)

stdint.h文件

http://www.azillionmonkeys.com/qed/pstdint.h

需要include头文件

#include <include/cef_app.h>
#include <include/cef_client.h>
#include <include/cef_render_handler.h>
           

定义接口类用以渲染到贴图

class RenderHandler : public CefRenderHandler {
public:
    IDirect3DTexture9 * m_pTexture;
    RenderHandler(IDirect3DTexture * pTexture) : m_pTexture(pTexture) {}
    virtual bool GetViewRect(CefRefPtr<CefBrowser> browser, CefRect & rect) {
        D3DSURFACE_DESC desc;
        m_pTexture->GetLevelDesc(0, &desc);
        rect = CefRect(0,0,desc.Width,desc.Height);
        return true;
    }
    virtual void OnPaint(CefRefPtr<CefBrowser> browser, PaintElementType type, const RectList & dirtyRects, const void * buffer, int width, int height) {
        D3DLOCKED_RECT rc;
        RECT lcRect = {0,0,width,height};
        HRESULT hr = m_pTexture->LockRect(0, &rc, &lcRect, 0);
        memcpy(rc.pBits, buffer, width * height * 4);
        m_pTexture->UnlockRect(0);
    }
    IMPLEMENT_REFCOUNTING(RenderHandler);
};
class BrowserClient : public CefClient {
public:
    CefRefPtr<CefRenderHandler> m_renderHandler;
    BrowserClient(RenderHandler * renderHandler) : m_renderHandler(renderHandler) {}
    virtual CefRefPtr<CefRenderHandler> GetRenderHandler() {
        return m_renderHandler;
    }
    IMPLEMENT_REFCOUNTING(BrowserClient);
};
           

全局初始化流程

CefMainArgs args(hInstance);
int result = CefExecuteProcess(args, NULL, NULL);
if (result >= 0) {
    return result;
}
CefSettings settings;
result = CefInitialize(args, settings, NULL, NULL);
if (!result) {
    return -1;
}
           

创建D3D设备时期

pd3dDevice->CreateTexture(1024,1024,1,0,D3DFMT_A8R8G8B8,D3DPOOL_MANAGED,&g_pTexture,NULL);
RenderHandler* renderHandler = new RenderHandler(g_pTexture);
CefWindowInfo windowInfo;
CefBrowserSettings browserSettings;
windowInfo.SetAsWindowless(DXUTGetHWND(), false);
g_browserClient = new BrowserClient(renderHandler);
g_browser = CefBrowserHost::CreateBrowserSync(windowInfo, g_browserClient.get(), "http://www.google.com", browserSettings, NULL);
           

在主消息循环处,类似于d3d框架中的OnD3D9FrameRender

CefDoMessageLoopWork();
           

此时的g_pTexture内就是网页内容了,可以在合适的时机渲染出来

常用消息处理

// 鼠标消息处理
g_browser->GetHost()->SendMouseClickEvent(..);
g_browser->GetHost()->SendMouseMoveEvent(..);
g_browser->GetHost()->SendMouseWheelEvent(..);
// 键盘消息处理
g_browser->GetHost()->SendKeyEvent(..);
// 显示隐藏处理
g_browser->GetHost()->WasHidden(..);
// 当窗体(贴图)大小发生变化时
g_browser->GetHost()->WasResized();
// 当窗体获取/丢失焦点时
g_browser->GetHost()->SendFocusEvent(..);
           

在销毁D3D设备时销毁对应的浏览器对象

g_browser = NULL;
g_browserClient = NULL;
CefShutdown();
SAFE_RELEASE(g_pTexture);
           

继续阅读