由于WKE的精简模式,导致原有的SOUI不支持针对诸多内容的调用,此处针对WKE的部分内容做升级,以支持对应的功能。

目的:使WKE可以_blank弹出新窗口。

由国人 海绵宝宝维护的WKE新分支:https://github.com/cexer/wke

编译新WKE的方式很简单:

1、下载master,并解压缩,如果有git就自己clone一下就好了

2、运行根目录下的vs2008.bat,打开后直接编译即可,时间根据CPU不同而不同。

SOUI的模式是动态加载函数,所以参考一下WKE头文件,即可完成函数调用。

特别注意,SOUI的WKE.DLL中已经将WKE封装为类,此处的WKE.DLL内是纯C函数,无类,所以我们要自己写。

如果懒得自己写动态接口,就直接引用WKE.H就好了,然后连接一下WKE.LIB(这样只是不太好剥离或按目录加载库)。

由于本人巨懒,懒癌晚期,所以我直接引用lib了,哈哈哈。

直接上点干货

  1 /*!
  2  * \file SWkeWebkitEx.h
  3  * \date 2016/04/12 14:31
  4  *
  5  * \author koangel
  6  * Contact: jackliu100@gmail.com
  7  *
  8  * \brief 针对新版本WKE的封装,使用C函数版本
  9  *
 10  * 为了区分改为SWkeWbkitEx名,与之前版本不冲突。
 11 */
 12 #pragma once
 13 #include <wke.h>
 14
 15 #pragma comment(lib,"wke.lib")
 16
 17 namespace SOUI
 18 {
 19     // 此处改为自己渲染程序
 20     class SWkeRenderGDI
 21     {
 22     public:
 23         SWkeRenderGDI()
 24             :m_hView(NULL)
 25             , m_hDC(NULL)
 26             , m_hBitmap(NULL)
 27             , m_pixels(NULL)
 28             , m_width(0)
 29             , m_height(0)
 30         {
 31         }
 32
 33         virtual ~SWkeRenderGDI()
 34         {
 35             if (m_hDC)
 36                 DeleteDC(m_hDC);
 37
 38             if (m_hBitmap)
 39                 DeleteObject(m_hBitmap);
 40         }
 41
 42         virtual bool init(HWND hView)
 43         {
 44             m_hView = hView;
 45             m_hDC = CreateCompatibleDC(0);
 46
 47             RECT rect;
 48             GetClientRect(hView, &rect);
 49             resize(rect.right, rect.bottom);
 50             return true;
 51         }
 52
 53         virtual void destroy()
 54         {
 55             delete this;
 56         }
 57
 58         virtual void resize(unsigned int w, unsigned int h)
 59         {
 60             if (m_width == w && m_height == h)
 61                 return;
 62
 63             m_width = w;
 64             m_height = h;
 65             m_pixels = NULL;
 66         }
 67
 68         virtual void render(wkeWebView webView)
 69         {
 70             if (wkeIsDirty(webView))
 71             {
 72                 if (m_pixels == NULL)
 73                     createBitmap();
 74
 75                 wkePaint2(webView, m_pixels, 0);
 76
 77                 HDC hDC = GetDC(m_hView);
 78                 BitBlt(hDC, 0, 0, m_width, m_height, m_hDC, 0, 0, SRCCOPY);
 79                 ReleaseDC(m_hView, hDC);
 80             }
 81         }
 82
 83         void createBitmap()
 84         {
 85             BITMAPINFO bi;
 86             memset(&bi, 0, sizeof(bi));
 87             bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
 88             bi.bmiHeader.biWidth = int(m_width);
 89             bi.bmiHeader.biHeight = -int(m_height);
 90             bi.bmiHeader.biPlanes = 1;
 91             bi.bmiHeader.biBitCount = 32;
 92             bi.bmiHeader.biCompression = BI_RGB;
 93
 94             HBITMAP hbmp = ::CreateDIBSection(0, &bi, DIB_RGB_COLORS, &m_pixels, NULL, 0);
 95
 96             SelectObject(m_hDC, hbmp);
 97
 98             if (m_hBitmap)
 99                 DeleteObject(m_hBitmap);
100
101             m_hBitmap = hbmp;
102         }
103
104     private:
105         HWND m_hView;
106         HBITMAP m_hBitmap;
107         HDC m_hDC;
108         unsigned int m_width;
109         unsigned int m_height;
110         void* m_pixels;
111     };
112
113     const char TM_TICKER = 1;
114     class SWkeWebkitEx :
115         public SWindow,protected IIdleHandler
116     {
117         SOUI_CLASS_NAME(SWkeWebkit, L"wkeWebkit")
118     public:
119         SWkeWebkitEx();
120         virtual ~SWkeWebkitEx();
121
122         // 初始化WKE
123         static void SWkeInit();
124         // 销毁WKE
125         static void SWkeFinalize();
126
127         wkeWebView    GetWebView() { return m_pWebView; }
128     protected:
129         virtual BOOL OnIdle();
130     protected:
131         int OnCreate(void *);
132         void OnDestroy();
133         void OnPaint(IRenderTarget *pRT);
134         void OnSize(UINT nType, CSize size);
135         LRESULT OnMouseEvent(UINT uMsg, WPARAM wParam, LPARAM lParam);
136         LRESULT OnMouseWheel(UINT uMsg, WPARAM wParam, LPARAM lParam);
137         LRESULT OnKeyDown(UINT uMsg, WPARAM wParam, LPARAM lParam);
138         LRESULT OnKeyUp(UINT uMsg, WPARAM wParam, LPARAM lParam);
139         LRESULT OnChar(UINT uMsg, WPARAM wParam, LPARAM lParam);
140         LRESULT OnImeStartComposition(UINT uMsg, WPARAM wParam, LPARAM lParam);
141         void OnSetFocus();
142         void OnKillFocus();
143         void OnTimer(char cTimerID);
144
145         virtual BOOL OnSetCursor(const CPoint &pt);
146         virtual UINT OnGetDlgCode() { return SC_WANTALLKEYS; }
147         BOOL OnAttrUrl(SStringW strValue, BOOL bLoading);
148         SOUI_ATTRS_BEGIN()
149             ATTR_CUSTOM(L"url", OnAttrUrl)
150             SOUI_ATTRS_END()
151
152             SOUI_MSG_MAP_BEGIN()
153             MSG_WM_PAINT_EX(OnPaint)
154             MSG_WM_CREATE(OnCreate)
155             MSG_WM_DESTROY(OnDestroy)
156             MSG_WM_SIZE(OnSize)
157             MSG_WM_TIMER_EX(OnTimer)
158             MSG_WM_SETFOCUS_EX(OnSetFocus)
159             MSG_WM_KILLFOCUS_EX(OnKillFocus)
160             MESSAGE_RANGE_HANDLER_EX(WM_MOUSEFIRST, 0x209, OnMouseEvent)
161             MESSAGE_HANDLER_EX(WM_MOUSEWHEEL, OnMouseWheel)
162             MESSAGE_HANDLER_EX(WM_KEYDOWN, OnKeyDown)
163             MESSAGE_HANDLER_EX(WM_KEYUP, OnKeyUp)
164             MESSAGE_HANDLER_EX(WM_CHAR, OnChar)
165             MESSAGE_HANDLER_EX(WM_IME_STARTCOMPOSITION, OnImeStartComposition)
166             SOUI_MSG_MAP_END()
167     protected:
168         wkeWebView m_pWebView;
169         SStringW m_strUrl;
170         SWkeRenderGDI m_render;
171
172         static wkeWebView onCreateView(wkeWebView webView, void* param, const wkeNewViewInfo* info);
173     };
174 }

Cpp部分代码

  1 /*!
  2 * \file SWkeWebkitEx.cpp
  3 * \date 2016/04/12 14:31
  4 *
  5 * \author koangel
  6 * Contact: jackliu100@gmail.com
  7 *
  8 * \brief 针对新版本WKE的封装,使用C函数版本
  9 *
 10 * 为了区分改为SWkeWbkitEx名,与之前版本不冲突。
 11 */
 12 #include "stdafx.h"
 13 #include "SWkeWebkitEx.h"
 14 #pragma comment(lib,"imm32.lib")
 15 #pragma comment(lib,"msimg32.lib")
 16
 17 namespace SOUI
 18 {
 19     SWkeWebkitEx::SWkeWebkitEx()
 20     {
 21         SWkeInit(); // 如果需要请此处屏蔽(有多个WEBVIEW时)
 22         m_pWebView = nullptr;
 23     }
 24
 25
 26     SWkeWebkitEx::~SWkeWebkitEx()
 27     {
 28         SWkeFinalize(); // 如果需要请此处屏蔽
 29     }
 30
 31     void SWkeWebkitEx::SWkeInit()
 32     {
 33         wkeInitialize();
 34     }
 35
 36     void SWkeWebkitEx::SWkeFinalize()
 37     {
 38         wkeFinalize();
 39     }
 40
 41     BOOL SWkeWebkitEx::OnIdle()
 42     {
 43         m_render.render(m_pWebView);
 44         InvalidateRect(NULL);
 45         return TRUE;
 46     }
 47
 48
 49     int SWkeWebkitEx::OnCreate(void *)
 50     {
 51         m_pWebView = wkeCreateWebView();
 52         if (!m_pWebView) return 1;
 53
 54         HWND hWnd=GetContainer()->GetHostHwnd();
 55
 56         m_render.init(hWnd);
 57
 58         wkeSetHostWindow(m_pWebView, hWnd);
 59         wkeSetTransparent(m_pWebView, false);
 60         wkeOnCreateView(m_pWebView, &SWkeWebkitEx::onCreateView, nullptr);
 61         wkeSetUserAgent(m_pWebView, "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36");
 62         wkeLoadURLW(m_pWebView,m_strUrl);
 63         SetTimer(TM_TICKER,50);
 64         return 0;
 65     }
 66
 67     void SWkeWebkitEx::OnDestroy()
 68     {
 69         if (m_pWebView)
 70         {
 71             wkeDestroyWebView(m_pWebView);
 72             m_pWebView = nullptr;
 73         }
 74     }
 75
 76     void SWkeWebkitEx::OnPaint(IRenderTarget *pRT)
 77     {
 78         CRect rcClip;
 79         pRT->GetClipBox(&rcClip);
 80         CRect rcClient;
 81         GetClientRect(&rcClient);
 82         CRect rcInvalid;
 83         rcInvalid.IntersectRect(&rcClip, &rcClient);
 84         HDC hdc = pRT->GetDC();
 85         HDC hWebviewHC = (HDC)wkeGetViewDC(m_pWebView);
 86         if (GetStyle().m_byAlpha != 0xff)
 87         {
 88             BLENDFUNCTION bf = { AC_SRC_OVER,0,GetStyle().m_byAlpha,AC_SRC_ALPHA };
 89             AlphaBlend(hdc, rcInvalid.left, rcInvalid.top, rcInvalid.Width(), rcInvalid.Height(),hWebviewHC, rcInvalid.left - rcClient.left, rcInvalid.top - rcClient.top, rcInvalid.Width(), rcInvalid.Height(), bf);
 90         }
 91         else
 92         {
 93             BitBlt(hdc, rcInvalid.left, rcInvalid.top, rcInvalid.Width(), rcInvalid.Height(),hWebviewHC, rcInvalid.left - rcClient.left, rcInvalid.top - rcClient.top, SRCCOPY);
 94         }
 95         pRT->ReleaseDC(hdc);
 96     }
 97
 98     void SWkeWebkitEx::OnSize(UINT nType, CSize size)
 99     {
100         __super::OnSize(nType,size);
101         wkeResize(m_pWebView, size.cx, size.cy);
102         m_render.resize(size.cx, size.cy);
103     }
104
105     LRESULT SWkeWebkitEx::OnMouseEvent(UINT message, WPARAM wParam, LPARAM lParam)
106     {
107         if (message == WM_LBUTTONDOWN || message == WM_MBUTTONDOWN || message == WM_RBUTTONDOWN)
108         {
109             SetFocus();
110             SetCapture();
111         }
112         else if (message == WM_LBUTTONUP || message == WM_MBUTTONUP || message == WM_RBUTTONUP)
113         {
114             ReleaseCapture();
115         }
116
117         CRect rcClient;
118         GetClientRect(&rcClient);
119
120         int x = GET_X_LPARAM(lParam) - rcClient.left;
121         int y = GET_Y_LPARAM(lParam) - rcClient.top;
122
123         unsigned int flags = 0;
124
125         if (wParam & MK_CONTROL)
126             flags |= WKE_CONTROL;
127         if (wParam & MK_SHIFT)
128             flags |= WKE_SHIFT;
129
130         if (wParam & MK_LBUTTON)
131             flags |= WKE_LBUTTON;
132         if (wParam & MK_MBUTTON)
133             flags |= WKE_MBUTTON;
134         if (wParam & MK_RBUTTON)
135             flags |= WKE_RBUTTON;
136
137         bool bHandled = wkeFireMouseEvent(m_pWebView, message, x, y, flags); //m_pWebView->mouseEvent(message, x, y, flags);
138         SetMsgHandled(bHandled);
139         return 0;
140     }
141
142     LRESULT SWkeWebkitEx::OnMouseWheel(UINT uMsg, WPARAM wParam, LPARAM lParam)
143     {
144         POINT pt;
145         pt.x = GET_X_LPARAM(lParam);
146         pt.y = GET_Y_LPARAM(lParam);
147         HWND hWnd=GetContainer()->GetHostHwnd();
148         ScreenToClient(hWnd, &pt);
149
150         int delta = GET_WHEEL_DELTA_WPARAM(wParam);
151
152         unsigned int flags = 0;
153
154         if (wParam & MK_CONTROL)
155             flags |= WKE_CONTROL;
156         if (wParam & MK_SHIFT)
157             flags |= WKE_SHIFT;
158
159         if (wParam & MK_LBUTTON)
160             flags |= WKE_LBUTTON;
161         if (wParam & MK_MBUTTON)
162             flags |= WKE_MBUTTON;
163         if (wParam & MK_RBUTTON)
164             flags |= WKE_RBUTTON;
165
166
167         bool bHandled = wkeFireMouseWheelEvent(m_pWebView, pt.x,pt.y,delta,flags); //m_pWebView->mouseEvent(message, x, y, flags);
168         SetMsgHandled(bHandled);
169         return 0;
170     }
171
172     LRESULT SWkeWebkitEx::OnKeyDown(UINT uMsg, WPARAM wParam, LPARAM lParam)
173     {
174         unsigned int virtualKeyCode = wParam;
175         unsigned int flags = 0;
176         if (HIWORD(lParam) & KF_REPEAT)
177             flags |= WKE_REPEAT;
178         if (HIWORD(lParam) & KF_EXTENDED)
179             flags |= WKE_EXTENDED;
180
181         bool handled = wkeFireKeyDownEvent(m_pWebView, virtualKeyCode, flags, false);
182         SetMsgHandled(handled);
183         return 0;
184     }
185
186     LRESULT SWkeWebkitEx::OnKeyUp(UINT uMsg, WPARAM wParam, LPARAM lParam)
187     {
188         unsigned int virtualKeyCode = wParam;
189         unsigned int flags = 0;
190         if (HIWORD(lParam) & KF_REPEAT)
191             flags |= WKE_REPEAT;
192         if (HIWORD(lParam) & KF_EXTENDED)
193             flags |= WKE_EXTENDED;
194
195         bool handled = wkeFireKeyUpEvent(m_pWebView, virtualKeyCode, flags, false);
196         SetMsgHandled(handled);
197         return 0;
198     }
199
200     LRESULT SWkeWebkitEx::OnChar(UINT uMsg, WPARAM wParam, LPARAM lParam)
201     {
202         unsigned int charCode = wParam;
203         unsigned int flags = 0;
204         if (HIWORD(lParam) & KF_REPEAT)
205             flags |= WKE_REPEAT;
206         if (HIWORD(lParam) & KF_EXTENDED)
207             flags |= WKE_EXTENDED;
208
209         bool handled = wkeFireKeyPressEvent(m_pWebView, charCode, flags, false);
210         SetMsgHandled(handled);
211         return 0;
212     }
213
214     LRESULT SWkeWebkitEx::OnImeStartComposition(UINT uMsg, WPARAM wParam, LPARAM lParam)
215     {
216         wkeRect caret = wkeGetCaretRect(m_pWebView);
217
218         CRect rcClient;
219         GetClientRect(&rcClient);
220
221         CANDIDATEFORM form;
222         form.dwIndex = 0;
223         form.dwStyle = CFS_EXCLUDE;
224         form.ptCurrentPos.x = caret.x + rcClient.left;
225         form.ptCurrentPos.y = caret.y + caret.h + rcClient.top;
226         form.rcArea.top = caret.y + rcClient.top;
227         form.rcArea.bottom = caret.y + caret.h + rcClient.top;
228         form.rcArea.left = caret.x + rcClient.left;
229         form.rcArea.right = caret.x + caret.w + rcClient.left;
230         COMPOSITIONFORM compForm;
231         compForm.ptCurrentPos = form.ptCurrentPos;
232         compForm.rcArea = form.rcArea;
233         compForm.dwStyle = CFS_POINT;
234
235         HWND hWnd = GetContainer()->GetHostHwnd();
236         HIMC hIMC = ImmGetContext(hWnd);
237         ImmSetCandidateWindow(hIMC, &form);
238         ImmSetCompositionWindow(hIMC, &compForm);
239         ImmReleaseContext(hWnd, hIMC);
240
241         return 0;
242     }
243
244     void SWkeWebkitEx::OnSetFocus()
245     {
246         wkeSetFocus(m_pWebView);
247     }
248
249     void SWkeWebkitEx::OnKillFocus()
250     {
251         wkeKillFocus(m_pWebView);
252     }
253
254     void SWkeWebkitEx::OnTimer(char cTimerID)
255     {
256         if (cTimerID == TM_TICKER)
257         {
258             m_render.render(m_pWebView);
259             InvalidateRect(NULL);
260         }
261     }
262
263     BOOL SWkeWebkitEx::OnSetCursor(const CPoint &pt)
264     {
265         return TRUE;
266     }
267
268     BOOL SWkeWebkitEx::OnAttrUrl(SStringW strValue, BOOL bLoading)
269     {
270         m_strUrl = strValue;
271         if (!bLoading)
272             wkeLoadURLW(m_pWebView,m_strUrl);
273         return !bLoading;
274     }
275
276     wkeWebView SWkeWebkitEx::onCreateView(wkeWebView webView, void* param, const wkeNewViewInfo* info)
277     {
278         const wchar_t* target = wkeGetStringW(info->target);
279         const wchar_t* url = wkeGetStringW(info->url);
280
281         if (wcscmp(target, L"") == 0 || wcscmp(target, L"_blank") == 0)
282         {
283             if (wcsnicmp(url, L"file:///", 8) == 0)
284                 url += 8;
285             // 此处弹出其他程序运行指定内容 WKE代码部分
286             ShellExecuteW(NULL, L"open", (LPWSTR)url, NULL, NULL, SW_SHOW);
287             return NULL;
288         }
289         else if (wcscmp(target, L"_self") == 0)
290         {
291             return webView;
292         }
293         else if (wcscmp(target, L"wontOpen") == 0)
294         {
295             return NULL;
296         }
297
298         return webView;
299     }
300
301 }

对于Alert本人暂未测试,请稍后自行测试。

编译请使用海面宝宝同学的WKE,妥妥的赞一个。

转载于:https://www.cnblogs.com/koangel/p/5383131.html

[原创]升级SOUI WKE以支持_blank相关推荐

  1. 阿里云PAI-Diffusion功能再升级,全链路支持模型调优,平均推理速度提升75%以上

    导读 随着Stable Diffusion模型在AI圈的爆火,AI生成内容(AI Generated Content,AIGC)的应用呈现出井喷式的增长趋势.其中,文图生成(Text-to-image ...

  2. 最新支持android的手机型号,科技知识:哪些手机可以升级安卓11 Android11支持机型大全...

    今天要来给大家介绍下哪些手机可以升级安卓11 Android11支持机型大全,之所以要来给大家针对这个哪些手机可以升级安卓11 Android11支持机型大全进行一个介绍的主要目的是现在很多小伙伴门对 ...

  3. aardio - 升级bindConfig函数,支持多属性和多子组件

    一.需求分析 aardio的 winform.bindConfig() 函数,绑定后,一个组件,只能保存一个属性. 有时候需要同时保存多个属性,比如一个comobox组件,需要保存项目列表,同时保存当 ...

  4. 升级4K屏,支持串流,奇遇Dream Pro上手体验

    去年底,奇遇Dream用2000元的价格在6DoF光学追踪VR一体机市场掀起一阵风潮,通过低价让更多用户体验到VR一体机的乐趣.也得益于此,根据IDC数据显示,2021年Q4爱奇艺奇遇VR出货量同比增 ...

  5. 升级打包工具packer-ng-plugin支持V3签名

    升级打包工具packer-ng-plugin支持V3签名 该库github:https://github.com/mcxiaoke/packer-ng-plugin 升级后jar包下载地址: http ...

  6. [CES 2018] TPCast发布升级版本,将支持微软MR设备

    (52VR优质原创翻译) 如果你最近刚买了TPCast,那就有点失算了因为我们今天刚刚得到消息:它的优化版本正向我们走来. 今天在今年的CES现场,TPCast公布了它的一组新的产品家族「TPCast ...

  7. linux升级tls,为CentOS升级OpenSSL 让Nginx支持TLS 1.2

    最近在调试微信小程序时,发现wx.request请求总是无法正确获取服务器端的数据,经过检查发现是因为服务器端https不支持微信要求的TLS 1.2版本. 登录到服务器上,用openssl vers ...

  8. conda如何升级pytorch_Google Cloud TPUs 支持 Pytorch 框架啦!

    在2019年PyTorch开发者大会上,Facebook,Google和Salesforce Research联合宣布启动PyTorch-TPU项目.项目的目标是在保持PyTorch的灵活性的同时让社 ...

  9. JeecgBoot的前端Form升级为FormModel用法(支持 v-model 绑定)

    FormModel 表单 (支持 v-model 绑定)(Ant Design of Vue 版本:1.5.0+) 新版form特性 1.支持双向绑定 2.无需v-decorator这个反人类属性设置 ...

  10. iPhone 13系列相机有大升级:全系支持光学防抖功能

    根据此前多方预测的消息,今年苹果将继续在9月推出全新的iPhone 13系列机型(也有消息称为iPhone 12s系列),按照往年惯例,今年的新iPhone的升级可能并不会太大,而最大的升级主要将集中 ...

最新文章

  1. C# 获取指定目录下所有文件信息、移动目录、拷贝目录
  2. 日媒:中国去年装机量猛增 成最大光伏日媒:中国去年装机量猛增 成最大光伏发电国家发电国家...
  3. Activity与Thread之间的通讯(old)
  4. hdfs 操作 入门api
  5. 迈入现代 Web 开发(GMTC 2021 演讲全文)
  6. javascript基础修炼——前端路由的基本原理
  7. linux安装python3.5_linux安装python3.5.1
  8. javascript小实例,阻止浏览器默认行为,真的能阻止吗?支持IE和标准浏览器的阻止默认行为的方法...
  9. java 调用阿里云翻译
  10. 网络工程师_记录的一些真题_2017上半年上午
  11. Golang 双链表(Doubly Linked List)
  12. 笔记本计算机没有没有显示无线网络连接,笔记本没有无线网络连接,教您笔记本没有无线网络连接...
  13. 5G学习(三)-SSB与初始接入
  14. 深澜系统服务器架构,S7510E-X结合深澜服务器做Portal无感知认证终端不定时掉线经验案例...
  15. c语言中的各种变量是如何存储的(-)
  16. 联想笔记本快捷键控制千千静听 2009年10月2日19:09:44
  17. 主板前置音频线接法几例(转)
  18. python实用脚本 知乎_Python 爬虫模拟登陆知乎
  19. 【Arduino】8位LED数码管(3461BS)
  20. 65.android 简单的写字动画效果

热门文章

  1. vs2015安装msdn_visual studio 2015离线版msdn下载和安装
  2. [转]coolfire黑客入门教程系列之(六)
  3. 破解“还原卡”技术方法
  4. 2021-2022年数学建模资料汇总——数学模型篇
  5. linux ubuntukylin和deepin操作系统的比较及改进方向的建议
  6. 8 种 NoSQL 数据库系统对比
  7. CodeProject.com上微软BizTalk平台技术文章集锦
  8. 反三角函数在线计算机,反三角函数(反正弦,反余弦,反正切,反余切,反正割,反余割)在线计算器_三贝计算网_23bei.com...
  9. python cplex优化包工具箱教程
  10. ssh配置config文件,实现vscode免密登陆