demo可以到github查看:https://github.com/zym479466697/duilib-miniblink.git

WkeWebkitUI.h

#ifndef __WKEWEBKIT__H_
#define __WKEWEBKIT__H_
#include <queue>
#include <Windows.h>
#include <objbase.h>
#include "..\..\DuiLib\UIlib.h"
using namespace DuiLib;#include "./wke.h"
using namespace wke;void LogFormat(const TCHAR* format, ...);class IWkeEvent
{
public://wke navigation callbackvirtual bool OnWkeNavigationCallback(wkeWebView webView, wkeNavigationType navigationType, const wkeString url) = 0;//wke loading callbackvirtual void OnWkeLoadingFinishCallback(wkeWebView webView, const wkeString url, wkeLoadingResult result, const wkeString failedReason) = 0;//wke title changedvirtual void OnWkeTitleChanged(wkeWebView webView, const wkeString title) = 0;//wke url changedvirtual void OnWkeUrlChanged(wkeWebView webView, const wkeString url) = 0;
};class CWkeWebkitUI : public CControlUI, public IMessageFilterUI
{
public:CWkeWebkitUI(void);virtual ~CWkeWebkitUI(void);//init wkestatic void WkeWebkit_Init();//shutdown wkestatic void WkeWebkit_Shutdown();static void  OnWkeTitleChanged(wkeWebView webView, void* param, const wkeString title);static void  OnWkeUrlChanged(wkeWebView webView, void* param, const wkeString url);static void  OnWkeLoadingFinishCallback(wkeWebView webView, void* param, const wkeString url, wkeLoadingResult result, const wkeString failedReason);static bool  OnWkeNavigationCallback(wkeWebView webView, void* param, wkeNavigationType navigationType, const wkeString url);static void  OnWkePaintUpdatedCallback(wkeWebView webView, void* param, const HDC hdc, int x, int y, int cx, int cy);IWebView* GetWebView() { return m_pWebView;}//load urlvoid LoadUrl(LPCTSTR pstrUrl);//load filevoid LoadFile(LPCTSTR pstrFile);//set wke event callbackvoid SetWkeEvent(IWkeEvent* pWkeEvent);//run jsjsValue RunJs(LPCTSTR pstrJs);//go backbool GoBack();//go forwardbool GoForward();
protected:LPCTSTR GetClass() const;LPVOID GetInterface(LPCTSTR pstrName);void SetPos(RECT rc, bool bNeedInvalidate = true);void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue);bool DoPaint(HDC hDC, const RECT& rcPaint, CControlUI* pStopControl);virtual void DoInit();virtual LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled);bool OnMouseEvent( UINT message, WPARAM wParam,LPARAM lParam);bool OnKeyDown( UINT uMsg, WPARAM wParam,LPARAM lParam);bool OnKeyUp( UINT uMsg, WPARAM wParam,LPARAM lParam);bool OnMouseWheel( UINT uMsg, WPARAM wParam,LPARAM lParam);bool OnChar( UINT uMsg, WPARAM wParam,LPARAM lParam);bool OnContextMenu( UINT uMsg, WPARAM wParam,LPARAM lParam);bool OnImeStartComposition( UINT uMsg, WPARAM wParam,LPARAM lParam);bool OnSetCursor();//wke need paintvoid OnPaintUpdatedCallback(const HDC hdc, int x, int y, int cx, int cy);
private:IWebView* m_pWebView;DWORD m_byAlpha;IWkeEvent* m_pWkeEvent;
};#endif /*__WKEWEBKIT__H_*/

WkeWebkitUI.cpp

#include "WkeWebkitUI.h"
#include <Imm.h>
#include <assert.h>
#pragma comment(lib,"imm32.lib")
#pragma comment(lib,"msimg32.lib")void LogFormat(const TCHAR* format, ...)
{TCHAR szLog[4096] = {0};va_list arglist;va_start(arglist, format);_vsnwprintf_s(szLog, 4096, format, arglist);va_end(arglist);OutputDebugString(szLog);OutputDebugString(_T("\r\n"));
}CWkeWebkitUI::CWkeWebkitUI(void) : m_byAlpha(255)
{m_pWebView = NULL;m_pWkeEvent = NULL;
}CWkeWebkitUI::~CWkeWebkitUI(void)
{if(m_pWebView){wkeDestroyWebView((wkeWebView)m_pWebView);m_pWebView = NULL;}
}void CWkeWebkitUI::WkeWebkit_Init()
{wkeInit();
}void CWkeWebkitUI::WkeWebkit_Shutdown()
{wkeShutdown();
}LPCTSTR CWkeWebkitUI::GetClass() const
{return _T("wkeWebKit");
}LPVOID CWkeWebkitUI::GetInterface(LPCTSTR pstrName)
{if( _tcscmp(pstrName, _T("wkeWebKit")) == 0 ) return static_cast<CWkeWebkitUI*>(this);return CControlUI::GetInterface(pstrName);
}void CWkeWebkitUI::DoInit()
{CControlUI::DoInit();m_pWebView = (IWebView*)wkeCreateWebView();//wkeSetHandle((wkeWebView)m_pWebView, GetManager()->GetPaintWindow());//wkeSetTransparent((wkeWebView)m_pWebView, true);wkeOnTitleChanged((wkeWebView)m_pWebView, OnWkeTitleChanged, this);wkeOnURLChanged((wkeWebView)m_pWebView, OnWkeUrlChanged, this);wkeOnLoadingFinish((wkeWebView)m_pWebView,OnWkeLoadingFinishCallback,this);wkeOnNavigation((wkeWebView)m_pWebView, OnWkeNavigationCallback,this);wkeOnPaintUpdated((wkeWebView)m_pWebView, OnWkePaintUpdatedCallback,this);wkeSetUserAgent((wkeWebView)m_pWebView, "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.2228.0 Safari/537.36");GetManager()->AddMessageFilter(this);
}void CWkeWebkitUI::SetPos(RECT rc, bool bNeedInvalidate)
{CControlUI::SetPos(rc, bNeedInvalidate);if(m_pWebView) {m_pWebView->resize(rc.right - rc.left, rc.bottom - rc.top);//wkeRepaintIfNeeded((wkeWebView)m_pWebView);}
}void CWkeWebkitUI::SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue)
{if( _tcscmp(pstrName, _T("alpha")) == 0 ) {LPTSTR pstr = NULL;m_byAlpha = _tcstol(pstrValue, &pstr, 10);  ASSERT(pstr);}else{CControlUI::SetAttribute(pstrName, pstrValue);}
}bool CWkeWebkitUI::DoPaint(HDC hDC, const RECT& rcPaint, CControlUI* pStopControl)
{if(!m_pWebView){return CControlUI::DoPaint(hDC, rcPaint, pStopControl);}RECT rcClip;::GetClipBox(hDC, &rcClip);RECT rcClient = GetClientPos();RECT rcInvalid;::IntersectRect(&rcInvalid, &rcClip,&rcClient);int invalidWidth = rcInvalid.right - rcInvalid.left;int invalidHeight = rcInvalid.bottom - rcInvalid.top;HDC hdcWke = wkeGetViewDC((wkeWebView)m_pWebView);BOOL ret = false;if(m_byAlpha != 0xff){BLENDFUNCTION bf = {AC_SRC_OVER, 0, m_byAlpha, AC_SRC_ALPHA };ret = AlphaBlend(hDC, rcInvalid.left, rcInvalid.top, invalidWidth, invalidHeight,hdcWke, rcInvalid.left-rcClient.left, rcInvalid.top-rcClient.top, invalidWidth, invalidHeight, bf);}else{ret = BitBlt(hDC, rcInvalid.left, rcInvalid.top, invalidWidth, invalidHeight,hdcWke, rcInvalid.left-rcClient.left, rcInvalid.top-rcClient.top,SRCCOPY);}return ret;
}LRESULT CWkeWebkitUI::MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled)
{bHandled = false;if (!IsVisible()){return 0;}switch(uMsg){case WM_SETFOCUS:{if(m_pWebView) m_pWebView->setFocus();}break;case WM_KILLFOCUS:{if(m_pWebView) m_pWebView->killFocus();}break;case WM_KEYDOWN:{if(!IsFocused()) return false;bHandled = OnKeyDown(uMsg, wParam, lParam);return true;}break;case WM_KEYUP:{if(!IsFocused()) return false;bHandled = OnKeyUp(uMsg, wParam, lParam);return true;}break;case WM_CHAR:{if(!IsFocused()) return false;bHandled = OnChar(uMsg, wParam, lParam);return true;}break;case WM_IME_STARTCOMPOSITION:{bHandled = OnImeStartComposition(uMsg, wParam, lParam);return true;}break;case WM_CONTEXTMENU:{bHandled = OnContextMenu(uMsg, wParam, lParam);return true;}break;default:{if(uMsg >= WM_MOUSEFIRST && uMsg <= WM_MOUSELAST){if(uMsg == WM_MOUSEHWHEEL || uMsg == WM_MOUSEWHEEL){if(!IsFocused()) return false;bHandled = OnMouseWheel(uMsg, wParam, lParam);}else{bHandled = OnMouseEvent(uMsg, wParam, lParam);}return true;}}break;}return false;
}void CWkeWebkitUI::LoadUrl(LPCTSTR pstrUrl)
{m_pWebView->loadURL(pstrUrl);
}void CWkeWebkitUI::LoadFile(LPCTSTR pstrFile)
{m_pWebView->loadFile(pstrFile);
}void CWkeWebkitUI::SetWkeEvent(IWkeEvent* pWkeEvent)
{m_pWkeEvent = pWkeEvent;
}jsValue CWkeWebkitUI::RunJs(LPCTSTR pstrJs)
{return m_pWebView->runJS(pstrJs);
}bool CWkeWebkitUI::GoBack()
{return m_pWebView->goBack();
}bool CWkeWebkitUI::GoForward()
{return m_pWebView->goForward();
}bool CWkeWebkitUI::OnMouseEvent( UINT message, WPARAM wParam,LPARAM lParam)
{RECT rcClient = GetClientPos();POINT point = {GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)};if(!PtInRect(&rcClient, point)){if (message == WM_LBUTTONDOWN || message == WM_MBUTTONDOWN || message == WM_RBUTTONDOWN){m_bFocused = false;}return false;}int x = GET_X_LPARAM(lParam)-rcClient.left;int y = GET_Y_LPARAM(lParam)-rcClient.top;if (message == WM_LBUTTONDOWN || message == WM_MBUTTONDOWN || message == WM_RBUTTONDOWN){SetFocus();GetManager()->SetCapture();}else if (message == WM_LBUTTONUP || message == WM_MBUTTONUP || message == WM_RBUTTONUP){GetManager()->ReleaseCapture();}unsigned int flags = 0;if (wParam & MK_CONTROL)flags |= WKE_CONTROL;if (wParam & MK_SHIFT)flags |= WKE_SHIFT;if (wParam & MK_LBUTTON)flags |= WKE_LBUTTON;if (wParam & MK_MBUTTON)flags |= WKE_MBUTTON;if (wParam & MK_RBUTTON)flags |= WKE_RBUTTON;bool bHandled = m_pWebView->fireMouseEvent(message, x, y, flags);OnSetCursor();return bHandled;
}bool CWkeWebkitUI::OnKeyDown( UINT uMsg, WPARAM wParam,LPARAM lParam )
{unsigned int flags = 0;if (HIWORD(lParam) & KF_REPEAT)flags |= WKE_REPEAT;if (HIWORD(lParam) & KF_EXTENDED)flags |= WKE_EXTENDED;bool bHandled = m_pWebView->fireKeyDownEvent(wParam, flags, false);return bHandled;
}bool CWkeWebkitUI::OnKeyUp( UINT uMsg, WPARAM wParam,LPARAM lParam)
{unsigned int flags = 0;if (HIWORD(lParam) & KF_REPEAT)flags |= WKE_REPEAT;if (HIWORD(lParam) & KF_EXTENDED)flags |= WKE_EXTENDED;bool bHandled = m_pWebView->fireKeyUpEvent(wParam, flags, false);return bHandled;
}bool CWkeWebkitUI::OnMouseWheel( UINT uMsg, WPARAM wParam,LPARAM lParam )
{POINT pt;pt.x = GET_X_LPARAM(lParam);pt.y = GET_Y_LPARAM(lParam);RECT rc = GetClientPos();pt.x -= rc.left;pt.y -= rc.top;int delta = GET_WHEEL_DELTA_WPARAM(wParam);unsigned int flags = 0;if (wParam & MK_CONTROL)flags |= WKE_CONTROL;if (wParam & MK_SHIFT)flags |= WKE_SHIFT;if (wParam & MK_LBUTTON)flags |= WKE_LBUTTON;if (wParam & MK_MBUTTON)flags |= WKE_MBUTTON;if (wParam & MK_RBUTTON)flags |= WKE_RBUTTON;//flags = wParam;bool bHandled = m_pWebView->fireMouseWheelEvent(pt.x, pt.y, delta, flags);return bHandled;
}bool CWkeWebkitUI::OnChar( UINT uMsg, WPARAM wParam,LPARAM lParam )
{unsigned int charCode = wParam;unsigned int flags = 0;if (HIWORD(lParam) & KF_REPEAT)flags |= WKE_REPEAT;if (HIWORD(lParam) & KF_EXTENDED)flags |= WKE_EXTENDED;//flags = HIWORD(lParam);bool bHandled = m_pWebView->fireKeyPressEvent(wParam, flags, false);return bHandled;
}bool CWkeWebkitUI::OnContextMenu( UINT uMsg, WPARAM wParam,LPARAM lParam)
{POINT pt;pt.x = GET_X_LPARAM(lParam);pt.y = GET_Y_LPARAM(lParam);if (pt.x != -1 && pt.y != -1)ScreenToClient(GetManager()->GetPaintWindow(), &pt);unsigned int flags = 0;if (wParam & MK_CONTROL)flags |= WKE_CONTROL;if (wParam & MK_SHIFT)flags |= WKE_SHIFT;if (wParam & MK_LBUTTON)flags |= WKE_LBUTTON;if (wParam & MK_MBUTTON)flags |= WKE_MBUTTON;if (wParam & MK_RBUTTON)flags |= WKE_RBUTTON;bool bHandled = m_pWebView->fireContextMenuEvent(pt.x, pt.y, flags);return bHandled;
}bool CWkeWebkitUI::OnImeStartComposition( UINT uMsg, WPARAM wParam,LPARAM lParam )
{wkeRect caret = m_pWebView->getCaret();RECT rcClient = GetClientPos();CANDIDATEFORM form;form.dwIndex = 0;form.dwStyle = CFS_EXCLUDE;form.ptCurrentPos.x = caret.x + rcClient.left;form.ptCurrentPos.y = caret.y + caret.h + rcClient.top;form.rcArea.top = caret.y + rcClient.top;form.rcArea.bottom = caret.y + caret.h + rcClient.top;form.rcArea.left = caret.x + rcClient.left;form.rcArea.right = caret.x + caret.w + rcClient.left;COMPOSITIONFORM compForm;compForm.ptCurrentPos=form.ptCurrentPos;compForm.rcArea=form.rcArea;compForm.dwStyle=CFS_POINT;HWND hWnd=GetManager()->GetPaintWindow();HIMC hIMC = ImmGetContext(hWnd);ImmSetCandidateWindow(hIMC, &form);ImmSetCompositionWindow(hIMC,&compForm);ImmReleaseContext(hWnd, hIMC);return true;
}bool CWkeWebkitUI::OnSetCursor()
{int cursorInfoType = wkeGetCursorInfoType((wkeWebView)m_pWebView);HCURSOR hCur = NULL;switch (cursorInfoType) {case WkeCursorInfoPointer:hCur = ::LoadCursor(NULL, IDC_ARROW);break;case WkeCursorInfoIBeam:hCur = ::LoadCursor(NULL, IDC_IBEAM);break;case WkeCursorInfoHand:hCur = ::LoadCursor(NULL, IDC_HAND);break;case WkeCursorInfoWait:hCur = ::LoadCursor(NULL, IDC_WAIT);break;case WkeCursorInfoHelp:hCur = ::LoadCursor(NULL, IDC_HELP);break;case WkeCursorInfoEastResize:hCur = ::LoadCursor(NULL, IDC_SIZEWE);break;case WkeCursorInfoNorthResize:hCur = ::LoadCursor(NULL, IDC_SIZENS);break;case WkeCursorInfoSouthWestResize:case WkeCursorInfoNorthEastResize:hCur = ::LoadCursor(NULL, IDC_SIZENESW);break;case WkeCursorInfoSouthResize:case WkeCursorInfoNorthSouthResize:hCur = ::LoadCursor(NULL, IDC_SIZENS);break;case WkeCursorInfoNorthWestResize:case WkeCursorInfoSouthEastResize:hCur = ::LoadCursor(NULL, IDC_SIZENWSE);break;case WkeCursorInfoWestResize:case WkeCursorInfoEastWestResize:hCur = ::LoadCursor(NULL, IDC_SIZEWE);break;case WkeCursorInfoNorthEastSouthWestResize:case WkeCursorInfoNorthWestSouthEastResize:hCur = ::LoadCursor(NULL, IDC_SIZEALL);break;default:hCur = ::LoadCursor(NULL, IDC_ARROW);break;}if (hCur) {::SetCursor(hCur);return true;}return false;
}void CWkeWebkitUI::OnWkeTitleChanged(wkeWebView webView, void* param, const wkeString title)
{CWkeWebkitUI* pWkeUI =(CWkeWebkitUI*)param;IWebView* pWebView = (IWebView*)webView;if(pWkeUI && pWkeUI->m_pWkeEvent){pWkeUI->m_pWkeEvent->OnWkeTitleChanged(webView, title);}
}void CWkeWebkitUI::OnWkeUrlChanged(wkeWebView webView, void* param, const wkeString url)
{CWkeWebkitUI* pWkeUI =(CWkeWebkitUI*)param;IWebView* pWebView = (IWebView*)webView;if(pWkeUI && pWkeUI->m_pWkeEvent){pWkeUI->m_pWkeEvent->OnWkeUrlChanged(webView, url);}
}void CWkeWebkitUI::OnWkeLoadingFinishCallback(wkeWebView webView, void* param, const wkeString url, wkeLoadingResult result, const wkeString failedReason)
{CWkeWebkitUI* pWkeUI =(CWkeWebkitUI*)param;IWebView* pWebView = (IWebView*)webView;if(pWkeUI && pWkeUI->m_pWkeEvent){pWkeUI->m_pWkeEvent->OnWkeLoadingFinishCallback(webView, url, result, failedReason);}
}bool  CWkeWebkitUI::OnWkeNavigationCallback(wkeWebView webView, void* param, wkeNavigationType navigationType, const wkeString url)
{CWkeWebkitUI* pWkeUI =(CWkeWebkitUI*)param;IWebView* pWebView = (IWebView*)webView;if(pWkeUI && pWkeUI->m_pWkeEvent){return pWkeUI->m_pWkeEvent->OnWkeNavigationCallback(webView, navigationType, url);}return true;
}void CWkeWebkitUI::OnWkePaintUpdatedCallback(wkeWebView webView, void* param, const HDC hdc, int x, int y, int cx, int cy)
{CWkeWebkitUI* pWkeUI =(CWkeWebkitUI*)param;IWebView* pWebView = (IWebView*)webView;if(pWkeUI && pWebView == pWkeUI->m_pWebView){pWkeUI->OnPaintUpdatedCallback(hdc, x,y,cx,cy);}
}void CWkeWebkitUI::OnPaintUpdatedCallback(const HDC hdc, int x, int y, int cx, int cy)
{//RECT invalidateRc = {x, y, cx, cy};//if( m_pManager != NULL ) m_pManager->Invalidate(invalidateRc);Invalidate();
}

miniblink 封装duilib 控件 WkeWebkitUI 离屏渲染方式相关推荐

  1. MFC中CSTATIC控件双击全屏/双击恢复

    双击全屏方法有两种 1.双击放大的时候调static控件的父句柄SerParent让控件的父句柄变成桌面,然后再提取桌面的分辨率用movewindow或者setwindowpos改变控件大小.恢复成原 ...

  2. 串口MSComm控件五种不同校验方式对数据收发的影响

    (2008-09-10 14:50:00)   http://blog.sina.com.cn/s/blog_470eccc60100arq7.html   串口MSComm控件有五种校验方式,分别是 ...

  3. 解决使用高分辨率笔记本分辨率放大100%以上运行程序界面控件不跟随方大方式qt+gtk+ui

    一.前言 解决使用高分辨率笔记本分辨率放大100%以上运行程序界面控件不跟随方大方式.使用100%时,qt界面太小,瞅着累眼睛,方大了界面,程序编译出来控件都跟着方大,布局都乱了,但是牺牲了qt cr ...

  4. MFC ActiveX控件的3种调用方式

    导读 1.导入ActiveX控件,拖放ActiveX控件方式 2.动态创建ActiveX控件 3.COM调用方式 1.导入ActiveX控件,拖放ActiveX控件方式 1.工具箱添加ActiveX控 ...

  5. 设置MaskedTextBox控件的格式,掩码方式检验输入方式

    #region 设置MaskedTextBox控件的格式,掩码方式检验输入方式/// <summary>/// 将MaskedTextBox控件的格式设为yyyy-mm-dd格式./// ...

  6. 基于Miniblink的WebBrowser控件CXMBWebCtrl及简单的浏览器Demo

    Miniblink是一款开源小巧的浏览器内核,基于Miniblink封装了一个WebBrowser控件CXMBWebCtrl便于使用,在控件CXMBWebCtrl的基础上使用MFC写了一个简单的浏览器 ...

  7. ASP.NET工作笔记014---用VB.NET封装服务器端控件

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 ASP.NET控件封装,用VB.NET,最近客户要把桌面应用web话,打算用 webform来做, ...

  8. 封装BackgroundWorker控件(提供源代码下载,F5即可见效果)

    Demo源码 背景 经常做些小程序或者小DEMO的时候会用到异步,多线程来执行一些比较耗时的工作同时将进度及时进行反馈.我通常会使用位于[ System.ComponentModel]命名空间下的Ba ...

  9. Qt 触屏研究-部分控件实现滑屏效果

    上一篇博客是对手势操作的一些研究,这一篇主要是处理在触屏上实现控件类似手机的那种滑动效果.在网上查询资料可知qt有这样的属性. 现在我测试的两个控件是QTableWidget和QTextEdit两个比 ...

最新文章

  1. asp.net 获取当前时间的格式
  2. Socket_send函数和recv函数详解
  3. Centos6.5静态IP设置
  4. Dubbo源码解析之Zookeeper连接
  5. linux基础知识——IPC之管道
  6. Linux服务器性能分析
  7. 【嵌入式Linux】嵌入式Linux应用开发基础知识之输入系统应用编程
  8. 房产管理信息系统 oracle,房地产企业项目信息管理系统|案场管理系统
  9. 拓端tecdat|R语言中的隐马尔可夫HMM模型实例
  10. Office 365系列(6)------Stage Migrate 搬迁方式至O365上来方法及步骤总结
  11. 计算机基础知识集体备课,计算机基础知识集体备课.doc
  12. 什么是元数据(Metadata)
  13. Leecode 55跳跃游戏
  14. 逻辑究竟是什么以及逻辑应当是什么?
  15. 验证方法学的历史及比较
  16. ubuntu下配置host的方法
  17. Tomcat中配置多个工程使用不同端口访问问题
  18. 面试官最想听哪些话?
  19. hdu 4389 X mod f(x) (数位dp||打表)
  20. Java学习必备武林秘籍,大侠请收好!

热门文章

  1. algorithm头文件下常用函数
  2. 名帖79 苏轼 楷书《醉翁亭记》
  3. 毕业设计 - 车道线检测(自动驾驶 机器视觉)
  4. SEO站长常用的查询工具
  5. 组件之间父子组件传值
  6. 网络云盘本地加载工具——“CloudMounter”
  7. 网络云盘springboot后端项目部署启动
  8. 树莓派4B上运行opcua协议DEMO接入kubeedge
  9. 曾几何时的一个项目,回忆,编程真的需要学习
  10. 区块链安全防范方法整理