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