chrominum cef 简单实现

来源:互联网 发布:ibcf算法 编辑:程序博客网 时间:2024/06/05 02:55

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);


0 0
原创粉丝点击