背景 javascript
以前,一直用WebBrowser,感受网页的应用需求够用了。html
直到Html5的出现,那么炫的功能,WebBrowser却展现不出来。就想有没有什么好的方法。不过一直没腾出手来,其次需求也不是太强烈,就没怎么琢磨。java
本周,接了航天与军方两个项目,须要作故障诊断,忽然发现,若是把HTML5的功能结合进来,管理系统与图形软件整合,效果会很好。windows
趁着周末,钻研了一下,竟然OK了。浏览器
思路 cookie
先找支持HTML5的浏览器,花了一个小时,肯定采用CEF(Chromium Embedded Framework),感受比较靠谱。app
靠谱的缘由是有源码。oop
若是有源码还搞不定,那也就枉编这么多年的代码了。ui
下载并编译,却忽然发现有个cef4delphi,直接装上就OK了。url
在 Delphi下很容易就调用成功了,但在CB下却折腾很久,最终解决后却发现,白折腾,把Dll/resource等放到目标目录下便可。
几点:
1) 初始化
GlobalCEFApp = new TCefApplication;
GlobalCEFApp->FrameworkDirPath = THelper::File::GetApplicationPath();
GlobalCEFApp->ResourcesDirPath = GlobalCEFApp->FrameworkDirPath;
GlobalCEFApp->LocalesDirPath = GlobalCEFApp->FrameworkDirPath +
L"locales\\";
GlobalCEFApp->Cache = GlobalCEFApp->FrameworkDirPath + L"cef\cache";
GlobalCEFApp->Cookies = GlobalCEFApp->FrameworkDirPath + L"cef\cookies";
GlobalCEFApp->UserDataPath = GlobalCEFApp->FrameworkDirPath +
L"cef\User Data";
GlobalCEFApp->EnableGPU = True; // Enable hardware acceleration
GlobalCEFApp->MultiThreadedMessageLoop = false;
GlobalCEFApp->FlashEnabled = false;
GlobalCEFApp->FastUnload = true;
2) 建立浏览器
bool __fastcall NewBrowser(TWinControl * control) {
if(Chromium) {
int times = 0;
while(!Chromium->CreateBrowser(control) && ++times < 5)
THelper::Util::Delay(1000);
if(times >= 5)
return false;
FBrowserParent = control;
return true;
}
return false;
}
3) 载入URL
Chromium->LoadURL(url);
这样就实现了CEF浏览器。后续再加入元素之间的交互功能。
演示效果
没有对比就没有伤害,看看这个浏览器(下图左)与WebBrowser(下图右)就知道了。
网上溜达的时候,发现一个求助帖:https://www.freelancer.hk/projects/CPlusPlus-Programming/Sample-VCL-application-with-embedded/
I need someone to write a sample VCL application in C++ Builder XE8 (or newer) aiming to demonstrate:
1. How to embed Chromium Embedded Framework (CEF - [url removed, login to view]) into an Win32 application.
2. How to navigate CEF component to a specified URL.
3. How to execute arbitrary (sample alert) Javascript within CEF component.
4. How to receive an event called before navigation (similar to OnBeforeNavigate2 in TCppWebBrowser).
5. How to receive an event called when page finishes loading (similar to OnDocumentComplete in TCppWebBrowser).
6. How to receive an event called when error occurs during page load (similar to OnNavigateError in TCppWebBrowser).
7. How to intercept popup windows (i.e. javascript alerts) called within CEF component HTML page.
The sample code should be compiled solely within C++ Builder IDE, no additional compilers should be involved.
The sample code should have comments regarding executed actions and intentions.
项目报价大概$400,惋惜项目关闭了。