sdk官网
https://bitbucket.org/chromiumembedded/cef
版本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);