前言

以前写过一个在Duilib中封装wke控件的文章:分享个Duilib中基于wke的浏览器控件,那个只是基于原始版本的wke代码编译出的头文件和dll封装的,使用中会发现网页的加载状态的回调并不及时,需要我们不断地去调用接口查询是否结束或者失败。最好的方法就是直接去修改源代码,所幸的是源代码工程已经整理得非常完善,下载下来后就可以用VS2008立即编译并且没有报错。(Wke源码位置:https://github.com/BlzFans/wke,已经很久没有更新过了,还是很感谢贡献者BlzFans)代码比较庞大,我主要还是关心网页的加载状态在内部是如何触发以及设置的。查看FrameLoaderClient类的封装,加载状态触发后是到了这里,通过更改成员变量的状态来标识,然后我们通过调用接口来查询这些标识的状态。感觉饶了一个湾子!直接把状态触发通过回调函数发出去不就可以了。

修改Wke源码

所以,我的修改就是增加回调机制,增加接口设置回调参数。(回调就是连接Wke内部和外部的桥梁)

增加回调接口类,需要加什么回调通知Wke外面都可扩展:

class IWebLoadCallback{public:virtual void   OnLoadStart(void* lpParam)          = 0;                                   //开始加载virtual void  OnDocumentReady(void* lpParam)      = 0;                                   //文档加载完毕virtual void    OnLoadFinish(void* lpParam)         = 0;                                   //网页加载完毕virtual void    OnLoadFail(void* lpParam)           = 0;                                   //网页加载失败virtual bool    OnNewWindow(void* lpParam, const wchar_t* pUrl, int nSize)          = 0;   //打开新窗口virtual void OnTitleChange(void* lpParam, const wchar_t* pTitle, int nSize)      = 0;   //网页标题变化virtual void    OnUrlChange(void* lpParam, const wchar_t* pUrl, int nSize)          = 0;   //网页链接变化};

在 接口类CWebView中增加接口设置回调参数

   
virtual void setLoadCallback(IWebLoadCallback* pCallback, void* lpParam);

回调指针初始为NULL,网页状态触发后如果外面设置了指针就会调用其对应的函数通知Wke外部,从而实现状态的主动触发。

修改后的Wke.h接口头文件

/** * BlzFans@hotmail.com* http://wke.sf.net* http://www.github.com/BlzFans/wke* licence LGPL**/#ifndef WKE_H
#define WKE_H#ifdef BUILDING_wke
#   define WKE_API __declspec(dllexport)
#else
#   define WKE_API __declspec(dllimport)
#endiftypedef char utf8;typedef struct {int x;int y;int w;int h;
} wkeRect;enum wkeMouseFlags
{WKE_LBUTTON = 0x01,WKE_RBUTTON = 0x02,WKE_SHIFT   = 0x04,WKE_CONTROL = 0x08,WKE_MBUTTON = 0x10,
};enum wkeKeyFlags
{WKE_EXTENDED = 0x0100,WKE_REPEAT = 0x4000,
};enum wkeMouseMsg
{WKE_MSG_MOUSEMOVE       =  0x0200,WKE_MSG_LBUTTONDOWN     =  0x0201,WKE_MSG_LBUTTONUP       =  0x0202,WKE_MSG_LBUTTONDBLCLK   =  0x0203,WKE_MSG_RBUTTONDOWN     =  0x0204,WKE_MSG_RBUTTONUP       =  0x0205,WKE_MSG_RBUTTONDBLCLK   =  0x0206,WKE_MSG_MBUTTONDOWN     =  0x0207,WKE_MSG_MBUTTONUP       =  0x0208,WKE_MSG_MBUTTONDBLCLK   =  0x0209,WKE_MSG_MOUSEWHEEL      =  0x020A,
};typedef void* jsExecState;
typedef __int64 jsValue;typedef void* wkeString;
/**c++ interface*-----------------------------------------------------------------------------------------------------------**/#ifdef __cplusplusnamespace wke
{class IWebLoadCallback{public:virtual void OnLoadStart(void* lpParam)          = 0;                                   //开始加载virtual void  OnDocumentReady(void* lpParam)      = 0;                                   //文档加载完毕virtual void    OnLoadFinish(void* lpParam)         = 0;                                   //网页加载完毕virtual void    OnLoadFail(void* lpParam)           = 0;                                   //网页加载失败virtual bool    OnNewWindow(void* lpParam, const wchar_t* pUrl, int nSize)          = 0;   //打开新窗口virtual void OnTitleChange(void* lpParam, const wchar_t* pTitle, int nSize)      = 0;   //网页标题变化virtual void    OnUrlChange(void* lpParam, const wchar_t* pUrl, int nSize)          = 0;   //网页链接变化};class IWebView{public:virtual void destroy() = 0;virtual const char* name() const = 0;virtual void setName(const char* name) = 0;virtual bool transparent() const = 0;virtual void setTransparent(bool transparent) = 0;virtual void loadURL(const utf8* url) = 0;virtual void loadURL(const wchar_t* url) = 0;virtual void loadHTML(const utf8* html) = 0;virtual void loadHTML(const wchar_t* html) = 0;virtual void loadFile(const utf8* filename) = 0;virtual void loadFile(const wchar_t* filename) = 0;virtual void stopLoading() = 0;virtual void reload() = 0;virtual const utf8* title() = 0;virtual const wchar_t* titleW() = 0;virtual void resize(int w, int h) = 0;virtual int width() const = 0;   /*viewport width*/virtual int height() const = 0;  /*viewport height*/virtual int contentsWidth() const = 0;  /*contents width*/virtual int contentsHeight() const = 0; /*contents height*/virtual void setDirty(bool dirty) = 0;virtual bool isDirty() const = 0;virtual void addDirtyArea(int x, int y, int w, int h) = 0;virtual void layoutIfNeeded() = 0;virtual void paint(void* bits, int pitch) = 0;virtual bool canGoBack() const = 0;virtual bool goBack() = 0;virtual bool canGoForward() const = 0;virtual bool goForward() = 0;virtual void selectAll() = 0;virtual void copy() = 0;virtual void cut() = 0;virtual void paste() = 0;virtual void delete_() = 0;virtual void setCookieEnabled(bool enable) = 0;virtual bool cookieEnabled() const = 0;virtual void setMediaVolume(float volume) = 0;virtual float mediaVolume() const = 0;virtual bool mouseEvent(unsigned int message, int x, int y, unsigned int flags) = 0;virtual bool contextMenuEvent(int x, int y, unsigned int flags) = 0;virtual bool mouseWheel(int x, int y, int delta, unsigned int flags) = 0;virtual bool keyUp(unsigned int virtualKeyCode, unsigned int flags, bool systemKey) = 0;virtual bool keyDown(unsigned int virtualKeyCode, unsigned int flags, bool systemKey) = 0;virtual bool keyPress(unsigned int virtualKeyCode, unsigned int flags, bool systemKey) = 0;virtual void focus() = 0;virtual void unfocus() = 0;virtual wkeRect getCaret() = 0;virtual jsValue runJS(const utf8* script) = 0;virtual jsValue runJS(const wchar_t* script) = 0;virtual jsExecState globalExec() = 0;virtual void sleep() = 0; //moveOffscreenvirtual void awaken() = 0; //moveOnscreenvirtual bool isAwake() const = 0;virtual void setZoomFactor(float factor) = 0;virtual float zoomFactor() const = 0;virtual void setEditable(bool editable) = 0;virtual void setLoadCallback(IWebLoadCallback* pCallback, void* lpParam) = 0;};
}typedef wke::IWebView* wkeWebView;#elsetypedef void* wkeWebView;#ifndef HAVE_WCHAR_T
typedef unsigned short wchar_t;
#endif#ifndef HAVE_BOOL
typedef unsigned char bool;
#define true 1
#define false 0
#endif#endif /*__cplusplus*//**c interface*----------------------------------------------------------------------------------------------------------**/#ifdef __cplusplus
extern "C"
{
#endifWKE_API void wkeInit();
WKE_API void wkeShutdown();
WKE_API void wkeUpdate();
WKE_API unsigned int wkeVersion();
WKE_API const utf8* wkeVersionString();typedef void* (*FILE_OPEN) (const char* path);
typedef void (*FILE_CLOSE) (void* handle);
typedef size_t (*FILE_SIZE) (void* handle);
typedef int (*FILE_READ) (void* handle, void* buffer, size_t size);
typedef int (*FILE_SEEK) (void* handle, int offset, int origin);WKE_API void wkeSetFileSystem(FILE_OPEN pfn_open, FILE_CLOSE pfn_close, FILE_SIZE pfn_size, FILE_READ pfn_read, FILE_SEEK pfn_seek);WKE_API wkeWebView wkeCreateWebView();
WKE_API wkeWebView wkeGetWebView(const char* name);
WKE_API void wkeDestroyWebView(wkeWebView webView);WKE_API const char* wkeWebViewName(wkeWebView webView);
WKE_API void wkeSetWebViewName(wkeWebView webView, const char* name);WKE_API bool wkeIsTransparent(wkeWebView webView);
WKE_API void wkeSetTransparent(wkeWebView webView, bool transparent);WKE_API void wkeLoadURL(wkeWebView webView, const utf8* url);
WKE_API void wkeLoadURLW(wkeWebView webView, const wchar_t* url);WKE_API void wkeLoadHTML(wkeWebView webView, const utf8* html);
WKE_API void wkeLoadHTMLW(wkeWebView webView, const wchar_t* html);WKE_API void wkeLoadFile(wkeWebView webView, const utf8* filename);
WKE_API void wkeLoadFileW(wkeWebView webView, const wchar_t* filename);WKE_API void wkeStopLoading(wkeWebView webView);
WKE_API void wkeReload(wkeWebView webView);WKE_API const utf8* wkeTitle(wkeWebView webView);
WKE_API const wchar_t* wkeTitleW(wkeWebView webView);WKE_API void wkeResize(wkeWebView webView, int w, int h);
WKE_API int wkeWidth(wkeWebView webView);
WKE_API int wkeHeight(wkeWebView webView);WKE_API int wkeContentsWidth(wkeWebView webView);
WKE_API int wkeContentsHeight(wkeWebView webView);WKE_API void wkeSetDirty(wkeWebView webView, bool dirty);
WKE_API bool wkeIsDirty(wkeWebView webView);
WKE_API void wkeAddDirtyArea(wkeWebView webView, int x, int y, int w, int h);
WKE_API void wkeLayoutIfNeeded(wkeWebView webView);
WKE_API void wkePaint(wkeWebView webView, void* bits, int pitch);WKE_API bool wkeCanGoBack(wkeWebView webView);
WKE_API bool wkeGoBack(wkeWebView webView);
WKE_API bool wkeCanGoForward(wkeWebView webView);
WKE_API bool wkeGoForward(wkeWebView webView);WKE_API void wkeSelectAll(wkeWebView webView);
WKE_API void wkeCopy(wkeWebView webView);
WKE_API void wkeCut(wkeWebView webView);
WKE_API void wkePaste(wkeWebView webView);
WKE_API void wkeDelete(wkeWebView webView);WKE_API void wkeSetCookieEnabled(wkeWebView webView, bool enable);
WKE_API bool wkeCookieEnabled(wkeWebView webView);WKE_API void wkeSetMediaVolume(wkeWebView webView, float volume);
WKE_API float wkeMediaVolume(wkeWebView webView);WKE_API bool wkeMouseEvent(wkeWebView webView, unsigned int message, int x, int y, unsigned int flags);
WKE_API bool wkeContextMenuEvent(wkeWebView webView, int x, int y, unsigned int flags);
WKE_API bool wkeMouseWheel(wkeWebView webView, int x, int y, int delta, unsigned int flags);
WKE_API bool wkeKeyUp(wkeWebView webView, unsigned int virtualKeyCode, unsigned int flags, bool systemKey);
WKE_API bool wkeKeyDown(wkeWebView webView, unsigned int virtualKeyCode, unsigned int flags, bool systemKey);
WKE_API bool wkeKeyPress(wkeWebView webView, unsigned int charCode, unsigned int flags, bool systemKey);WKE_API void wkeFocus(wkeWebView webView);
WKE_API void wkeUnfocus(wkeWebView webView);WKE_API wkeRect wkeGetCaret(wkeWebView webView);WKE_API jsValue wkeRunJS(wkeWebView webView, const utf8* script);
WKE_API jsValue wkeRunJSW(wkeWebView webView, const wchar_t* script);WKE_API jsExecState wkeGlobalExec(wkeWebView webView);WKE_API void wkeSleep(wkeWebView webView);
WKE_API void wkeAwaken(wkeWebView webView);
WKE_API bool wkeIsAwake(wkeWebView webView);WKE_API void wkeSetZoomFactor(wkeWebView webView, float factor);
WKE_API float wkeZoomFactor(wkeWebView webView);WKE_API void wkeSetEditable(wkeWebView webView, bool editable);WKE_API const utf8* wkeToString(const wkeString string);
WKE_API const wchar_t* wkeToStringW(const wkeString string);/***JavaScript Bind***/
#define JS_CALL __fastcall
typedef jsValue (JS_CALL *jsNativeFunction) (jsExecState es);typedef enum
{JSTYPE_NUMBER,JSTYPE_STRING,JSTYPE_BOOLEAN,JSTYPE_OBJECT,JSTYPE_FUNCTION,JSTYPE_UNDEFINED,
} jsType;WKE_API void jsBindFunction(const char* name, jsNativeFunction fn, unsigned int argCount);
WKE_API void jsBindGetter(const char* name, jsNativeFunction fn); /*get property*/
WKE_API void jsBindSetter(const char* name, jsNativeFunction fn); /*set property*/WKE_API int jsArgCount(jsExecState es);
WKE_API jsType jsArgType(jsExecState es, int argIdx);
WKE_API jsValue jsArg(jsExecState es, int argIdx);WKE_API jsType jsTypeOf(jsValue v);
WKE_API bool jsIsNumber(jsValue v);
WKE_API bool jsIsString(jsValue v);
WKE_API bool jsIsBoolean(jsValue v);
WKE_API bool jsIsObject(jsValue v);
WKE_API bool jsIsFunction(jsValue v);
WKE_API bool jsIsUndefined(jsValue v);
WKE_API bool jsIsNull(jsValue v);
WKE_API bool jsIsArray(jsValue v);
WKE_API bool jsIsTrue(jsValue v);
WKE_API bool jsIsFalse(jsValue v);WKE_API int jsToInt(jsExecState es, jsValue v);
WKE_API float jsToFloat(jsExecState es, jsValue v);
WKE_API double jsToDouble(jsExecState es, jsValue v);
WKE_API bool jsToBoolean(jsExecState es, jsValue v);
WKE_API const utf8* jsToString(jsExecState es, jsValue v);
WKE_API const wchar_t* jsToStringW(jsExecState es, jsValue v);WKE_API jsValue jsInt(int n);
WKE_API jsValue jsFloat(float f);
WKE_API jsValue jsDouble(double d);
WKE_API jsValue jsBoolean(bool b);WKE_API jsValue jsUndefined();
WKE_API jsValue jsNull();
WKE_API jsValue jsTrue();
WKE_API jsValue jsFalse();WKE_API jsValue jsString(jsExecState es, const utf8* str);
WKE_API jsValue jsStringW(jsExecState es, const wchar_t* str);
WKE_API jsValue jsObject(jsExecState es);
WKE_API jsValue jsArray(jsExecState es);WKE_API jsValue jsFunction(jsExecState es, jsNativeFunction fn, unsigned int argCount);//return the window object
WKE_API jsValue jsGlobalObject(jsExecState es);WKE_API jsValue jsEval(jsExecState es, const utf8* str);
WKE_API jsValue jsEvalW(jsExecState es, const wchar_t* str);WKE_API jsValue jsCall(jsExecState es, jsValue func, jsValue thisObject, jsValue* args, int argCount);
WKE_API jsValue jsCallGlobal(jsExecState es, jsValue func, jsValue* args, int argCount);WKE_API jsValue jsGet(jsExecState es, jsValue object, const char* prop);
WKE_API void jsSet(jsExecState es, jsValue object, const char* prop, jsValue v);WKE_API jsValue jsGetGlobal(jsExecState es, const char* prop);
WKE_API void jsSetGlobal(jsExecState es, const char* prop, jsValue v);WKE_API jsValue jsGetAt(jsExecState es, jsValue object, int index);
WKE_API void jsSetAt(jsExecState es, jsValue object, int index, jsValue v);WKE_API int jsGetLength(jsExecState es, jsValue object);
WKE_API void jsSetLength(jsExecState es, jsValue object, int length);WKE_API wkeWebView jsGetWebView(jsExecState es);WKE_API void jsGC(); //garbage collect#ifdef __cplusplus
}
#endif#endif

封装后的代码(无窗口Wke控件)

Duilib无窗口Wke控件的封装

#ifndef __UIWKEWEBKIT_H_
#define __UIWKEWEBKIT_H_
#pragma once
#include "wke.h"
#include <string>
using std::wstring;
#include "WkeCommon.h"namespace DuiLib
{class CWkeWebkitUI :public CControlUI{public:CWkeWebkitUI(void);~CWkeWebkitUI(void);virtual LPCTSTR    GetClass()const;virtual LPVOID  GetInterface(LPCTSTR pstrName);virtual void DoEvent(TEventUI& event);virtual void   SetPos(RECT rc);virtual void    DoInit();virtual void   PaintBkImage(HDC hDC);virtual void  SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue);//const   wstring& GetUrl()const ;bool    CanGoBack() const;bool  GoBack();bool   CanGoForward() const;bool   GoForward();void    StopLoad();void Refresh();wkeWebView    GetWebView();void   SetLoadCallback(wke::IWebLoadCallback* pCallback, void* lpParam)    { if ( m_pWebView ) m_pWebView->setLoadCallback(pCallback, lpParam); }void   Navigate(LPCTSTR lpUrl);void    LoadFile(LPCTSTR lpFile);void   LoadHtml(LPCTSTR lpHtml);jsExecState GetGlobalExec();wkeWebView GetWkeWebview() { return m_pWebView; }private:BYTE*     m_pBuffer;int           m_nSize;wstring     m_strUrl;wstring        m_strLastLink;wkeWebView    m_pWebView;};
}#endif//__UIWKEWEBKIT_H_
#include "StdAfx.h"
#include "UIWkeWebkit.h"
#pragma comment(lib, "wke/wke")namespace DuiLib{//CWkeWebkitUI::CWkeWebkitUI(void)
: m_pWebView(NULL)
, m_pBuffer(NULL)
, m_nSize(0)
{m_pWebView = wkeCreateWebView();m_pWebView->setTransparent(false);
}CWkeWebkitUI::~CWkeWebkitUI(void)
{m_pWebView->destroy();if ( m_pBuffer ){free(m_pBuffer);m_pBuffer = NULL;}
}LPCTSTR CWkeWebkitUI::GetClass() const
{return L"WkeWebkitUI";
}LPVOID CWkeWebkitUI::GetInterface( LPCTSTR pstrName )
{if( _tcscmp(pstrName, _T("WkeWebkit")) == 0 ) return this;return CControlUI::GetInterface(pstrName);
}void CWkeWebkitUI::DoEvent( TEventUI& event )
{switch( event.Type ){case UIEVENT_SETFOCUS:if ( m_pWebView ) m_pWebView->focus(); break;case UIEVENT_KILLFOCUS:if ( m_pWebView ) m_pWebView->unfocus(); break;case UIEVENT_WINDOWSIZE:if ( m_pWebView ) m_pWebView->resize(GET_X_LPARAM(event.lParam), GET_Y_LPARAM(event.lParam)); break;case UIEVENT_CHAR:{if ( NULL == m_pWebView ) break;unsigned int charCode = event.wParam;unsigned int flags = 0;if (HIWORD(event.lParam) & KF_REPEAT)flags |= WKE_REPEAT;if (HIWORD(event.lParam) & KF_EXTENDED)flags |= WKE_EXTENDED;bool bHandled=m_pWebView->keyPress(charCode, flags, false);if ( bHandled )return ;break;}case UIEVENT_KEYDOWN:{if ( NULL == m_pWebView ) break;unsigned int flags = 0;if (HIWORD(event.lParam) & KF_REPEAT)flags |= WKE_REPEAT;if (HIWORD(event.lParam) & KF_EXTENDED)flags |= WKE_EXTENDED;bool bHandled=m_pWebView->keyDown(event.wParam, flags, false);if ( event.wParam == VK_F5 )Refresh();if ( bHandled )return ;break;}case UIEVENT_KEYUP:{if ( NULL == m_pWebView ) break;unsigned int flags = 0;if (HIWORD(event.lParam) & KF_REPEAT)flags |= WKE_REPEAT;if (HIWORD(event.lParam) & KF_EXTENDED)flags |= WKE_EXTENDED;bool bHandled=m_pWebView->keyUp(event.wParam, flags, false);if ( bHandled )return ;break;}case UIEVENT_CONTEXTMENU:{if ( NULL == m_pWebView ) break;unsigned int flags = 0;if (event.wParam & MK_CONTROL)flags |= WKE_CONTROL;if (event.wParam & MK_SHIFT)flags |= WKE_SHIFT;if (event.wParam & MK_LBUTTON)flags |= WKE_LBUTTON;if (event.wParam & MK_MBUTTON)flags |= WKE_MBUTTON;if (event.wParam & MK_RBUTTON)flags |= WKE_RBUTTON;bool handled = m_pWebView->contextMenuEvent(event.ptMouse.x, event.ptMouse.y, flags);if ( handled )return ;break;}case UIEVENT_MOUSEMOVE:case UIEVENT_BUTTONDOWN:case UIEVENT_BUTTONUP:case UIEVENT_RBUTTONDOWN:case UIEVENT_DBLCLICK:{HWND hWnd=m_pManager->GetPaintWindow();if ( event.Type == UIEVENT_BUTTONDOWN ){::SetFocus(hWnd);SetCapture(hWnd);}else if ( event.Type == UIEVENT_BUTTONUP )ReleaseCapture();unsigned int flags = 0;if (event.wParam & MK_CONTROL)flags |= WKE_CONTROL;if (event.wParam & MK_SHIFT)flags |= WKE_SHIFT;if (event.wParam & MK_LBUTTON)flags |= WKE_LBUTTON;if (event.wParam & MK_MBUTTON)flags |= WKE_MBUTTON;if (event.wParam & MK_RBUTTON)flags |= WKE_RBUTTON;UINT uMsg=0;switch ( event.Type ){case UIEVENT_BUTTONDOWN: uMsg=WM_LBUTTONDOWN; break;case UIEVENT_BUTTONUP:      uMsg=WM_LBUTTONUP; break;case UIEVENT_RBUTTONDOWN: uMsg=WM_RBUTTONDOWN; break;case UIEVENT_DBLCLICK:      uMsg=WM_LBUTTONDBLCLK; break;case UIEVENT_MOUSEMOVE:       uMsg=WM_MOUSEMOVE; break;}bool bHandled = m_pWebView->mouseEvent(uMsg, event.ptMouse.x-m_rcItem.left, \event.ptMouse.y-m_rcItem.top, flags);if ( bHandled )return ;break;}case UIEVENT_SCROLLWHEEL:{int nFlag=GET_X_LPARAM(event.wParam);int delta = (nFlag==SB_LINEDOWN)?-120:120;unsigned int flags = 0;if (event.wParam & MK_CONTROL)flags |= WKE_CONTROL;if (event.wParam & MK_SHIFT)flags |= WKE_SHIFT;if (event.wParam & MK_LBUTTON)flags |= WKE_LBUTTON;if (event.wParam & MK_MBUTTON)flags |= WKE_MBUTTON;if (event.wParam & MK_RBUTTON)flags |= WKE_RBUTTON;bool handled = m_pWebView->mouseWheel(event.ptMouse.x, event.ptMouse.y, delta, flags);if ( handled )return ;break;}case UIEVENT_TIMER:{if ( event.wParam == WKE_TIMER_ID ){CControlUI* pParent = GetParent();if ( pParent->IsVisible() && m_pWebView->isDirty() ){HDC hDC = m_pManager->GetPaintDC();PaintBkImage(hDC);}}break;}default:CControlUI::DoEvent(event); break;}
}void CWkeWebkitUI::Navigate( LPCTSTR lpUrl )
{if ( m_pWebView ){m_pManager->SetTimer(this, WKE_TIMER_ID, 100);m_pWebView->loadURL(lpUrl);}
}void CWkeWebkitUI::SetPos( RECT rc )
{CControlUI::SetPos(rc);if ( m_pWebView )m_pWebView->resize(rc.right-rc.left, rc.bottom-rc.top);
}void CWkeWebkitUI::DoInit()
{if ( !m_strUrl.empty() )Navigate(m_strUrl.c_str());
}void CWkeWebkitUI::PaintBkImage( HDC hDC )
{int nWidth = m_rcItem.right - m_rcItem.left;int nHeight = m_rcItem.bottom - m_rcItem.top;HBITMAP hBitmap = CreateCompatibleBitmap(hDC, nWidth, nHeight);HDC hMemDC = CreateCompatibleDC(hDC);int nPitch = ((nWidth*32+31)>>5)<<2;int nSize = nHeight*nPitch;if ( NULL == m_pBuffer || m_nSize<nSize ){if ( m_pBuffer )free(m_pBuffer);m_pBuffer = (BYTE*)malloc(nSize);m_nSize = nSize;}m_pWebView->paint(m_pBuffer, 0);SetBitmapBits(hBitmap, nSize, m_pBuffer);HBITMAP hOldBmp = (HBITMAP)SelectObject(hMemDC, hBitmap);BitBlt(hDC, m_rcItem.left, m_rcItem.top, nWidth, nHeight, hMemDC, 0, 0, SRCCOPY);SelectObject(hMemDC, hOldBmp);DeleteDC(hMemDC);DeleteObject(hBitmap);
}bool CWkeWebkitUI::CanGoBack() const
{return m_pWebView?m_pWebView->canGoBack():false;
}bool CWkeWebkitUI::GoBack()
{return m_pWebView?m_pWebView->goBack():false;
}bool CWkeWebkitUI::CanGoForward() const
{return m_pWebView?m_pWebView->canGoForward():false;
}bool CWkeWebkitUI::GoForward()
{return m_pWebView?m_pWebView->goForward():false;
}void CWkeWebkitUI::StopLoad()
{if ( m_pWebView )m_pWebView->stopLoading();
}void CWkeWebkitUI::Refresh()
{if ( m_pWebView ){m_pWebView->reload();}
}wkeWebView CWkeWebkitUI::GetWebView()
{return m_pWebView;
}void CWkeWebkitUI::LoadFile( LPCTSTR lpFile )
{if ( m_pWebView )m_pWebView->loadFile(lpFile);
}void CWkeWebkitUI::LoadHtml( LPCTSTR lpHtml )
{if ( m_pWebView )m_pWebView->loadHTML(lpHtml);
}jsExecState CWkeWebkitUI::GetGlobalExec()
{if ( m_pWebView )return m_pWebView->globalExec();return NULL;
}const wstring& CWkeWebkitUI::GetUrl() const
{return m_strUrl;
}void CWkeWebkitUI::SetAttribute( LPCTSTR pstrName, LPCTSTR pstrValue )
{if ( _tcscmp(pstrName, _T("url")) == 0 )m_strUrl = pstrValue;elseCControlUI::SetAttribute(pstrName, pstrValue);
}}

如何使用

使用可以看看控件提供的接口,至于在Duilib中使用就更简单了,创建XML标签,解析时返回CWkeWebkitUI对象指针即可:
voidNavigate(LPCTSTR lpUrl); 打开一个连接
voidLoadFile(LPCTSTR lpFile);打开文件
voidLoadHtml(LPCTSTR lpHtml);加载HTML

代码贴的太长了(但是大部分都是自己写的,我很讨厌那些只会复制粘贴从不动脑经想的垃圾程序员,就知道跟你要源码,从不思考,行业的败类),有窗口模式的Wke控件封装将在下次分享,并指出两者间的差异。

分享修改Wke源代码后重新封装成Duilib控件的代码相关推荐

  1. VisionPro联合C#编程,康耐视cognex,程序案例 针对VisionPro联合C#框架搭建,封装成独立控件(控件如主图所示)

    VisionPro联合C#编程,康耐视cognex,程序案例 针对VisionPro联合C#框架搭建, 封装成独立控件(控件如主图所示)开发项目时将控件拖出,简单几句代码即可实现框架搭建.简单直接,对 ...

  2. VisionPro联合C#编程,康耐视cognex,程序案例 针对VisionPro联合C#框架搭建,封装成独立控件

    VisionPro联合C#编程,康耐视cognex,程序案例 针对VisionPro联合C#框架搭建,封装成独立控件 (控件如主图所示)开发项目时将控件拖出,简单几句代码即可实现框架搭建.简单直接,对 ...

  3. WPF 实现图片切成九宫格控件~

    WPF开发者QQ群: 340500857       由于微信群人数太多入群请添加小编微信号  yanjinhuawechat 或 W_Feng_aiQ 邀请入群 需备注WPF开发者  PS:有更好的 ...

  4. 控件包含代码块(即% ... %),因此无法修改控件集合解决

    控件包含代码块(即<% ... %>),因此无法修改控件集合 除了其他人分析的原因之外,还有我遇到的: 有人把Repeater里数据绑定写成<%=XXX%>,改了之后就没有那个 ...

  5. 控件包含代码块,因此无法修改控件集合

    文章转载至:  http://www.olnote.com/itlife/note/100000003.aspx 控件包含代码块(即<% ... %>),因此无法修改控件集合. 说明: 执 ...

  6. Wpf使用Winform控件后Wpf元素被Winform控件遮盖问题的解决

    Wpf使用Winform控件后Wpf元素被Winform控件遮盖问题的解决 参考文章: (1)Wpf使用Winform控件后Wpf元素被Winform控件遮盖问题的解决 (2)https://www. ...

  7. 用了GradientDrawable后,当点击控件时,控件大小发生变化

    android新手:发现一个很奇怪的问题,用了GradientDrawable后,当点击控件时,程序自动使我的一些控件大小保持一致,为什么呢,我就是不想它们保持一致啊 改了好久好久:GradientD ...

  8. 控件包含代码块(即 % ... %),因此无法修改控件集合。

    第一种: 在使用主题的时候出现 控件包含代码块(即 <% ... %>),因此无法修改控件集合错误,原来错误的原因是: 控件包含代码块(即 <% ... %>),因此无法修改控 ...

  9. chrome LiveReload – 修改网页源代码后帮你自动刷新浏览器

    在本地写网页代码,通常都是保存以后再在浏览器里刷新一遍看看效果,刷新这个可真是体力活,不过懒人也有福了,因为有了 LiveReload. LiveReload 是一款跨平台的软件,在 OS X.Win ...

  10. [课程][原创]yolox检测封装成类调用几句代码完成目标检测任务

    搞定系列:yolox检测封装成类调用 课程地址:搞定系列:yolox检测封装成类调用--深度学习视频教程-人工智能-CSDN程序员研修院 你将收获 1.学会Yolox封装基本技巧和大体思路 2.学会Y ...

最新文章

  1. YYDS 的 IDEA插件,没装上的安排起来!
  2. flutter制作具有自定义导航栏的渐进式 Web 应用程序
  3. 【CSS3】自定义滚动条样式 -webkit-scrollbar
  4. 痛与快乐有一个代码是什么_养一只真大型犬的生活是什么样的?铲屎官:痛并快乐着!...
  5. [BuildRelease Management]Team City
  6. sql cast()函数
  7. 设计模式的C语言应用-观察者模式-第四章
  8. php gbk json,GBK的页面输出JSON格式的php函数
  9. php 自定义 base64 解码,php base64 编码与解码实例代码
  10. Linux下设备驱动
  11. 天齐锂业通过聆讯:单季净利33亿 蒋卫平夫妇身价超500亿
  12. 人工智能 --- Python求解线性和非线性规划问题
  13. Verilog HDL设计方法
  14. zynq linux如何使用pl ip,ZYNQ+linux网口调试笔记(3)PL-ETH
  15. RxJava基本实现
  16. docker部署教程
  17. 通过Teamview后台去除限制
  18. tableau计算之(三)表计算——分区/寻址——手动计算/快速计算
  19. 写给想玩淘宝返利的各位,淘宝返利模式.
  20. 交叉网线 千兆网线 做法,开发板 PC直连

热门文章

  1. 金旭亮:我是一只IT小小鸟(新书推荐 序)
  2. sql分页查询越往后越慢
  3. 设计模式——设计模式三大分类以及六大原则
  4. 2017年5月13日 恒生电子笔试题
  5. DB2数据库基本操作
  6. java集成Cplex:Cplex下载、IDEA环境搭建、docker部署
  7. python实现bt下载器_Python 实现自动获取种子磁力链接方式
  8. Java后台开发学习进阶路线
  9. 深入浅出学python_深入浅出Python机器学习 (段小手) 完整pdf高清版[176MB]
  10. Centos 使用防火墙 Firewalld 进行流量转发