天天看點

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

繼續閱讀