编者按
数据可视化的作用不容小觑,然而很多朋友或许并没有真正操刀体验的经历。
在当今数据驱动的时代,数据可视化已成为分析的重要工具。ECharts作为一款强大的图表库,可以帮助开发者快速创建丰富的交互式图表,便于直观展示数据。本文将探讨如何在MFC中通过WebView2技术结合ECharts进行数据可视化分析,并详
细阐述数据的准备、处理和展示过程。
在上述架构下,C++桌面端程序通过构造web网页和组织数据,实现借助ECharts展示数据的目的。首先,请大家看一下最终效果,如下图所示。在图示中,左边的两个表格,是我在应用程序中为组织数据提供的用户界面,右边部分是展示的“关联关系”图示。诚然,在这个架构下,如何显示图像,以及如何分析数据之间的关联关系,完全不用开发者费心。
在这个过程中,需要向大家讲明白四个技术点。我们一一道来。
三、几个主要的技术要点
在MFC桌面应用程序中,有很多种方法可以实现对web网页的访问和显示。最纷繁复杂的当属使用原始socket,这也是学习网络通信技术的底层基础,在应用层开发中几乎不太可能用到这种技术了。
第二种方法可以使用CHttpFile、CHttpConnectionj等封装好的类,优点是不“挑”浏览器类型,兼容性较好。缺点是无法实现对
使用新技术的web网页效果。
本案例中,小编使用了webview2技术。具体实现的细节如下:
#include
using namespace Microsoft::WRL
(3)定义变量,全局或者局部变量均可以,如果不允许其他方法修改,则可以增加static标识。
// 指向webview2控件的WebViewController
wil::com_ptr
webviewController = nullptr;
wil::com_ptr
webview = nullptr;
(4)初始化控件并实现对某URL网址的访问。下面的代码虽然显得貌似很复杂,不过全文引用即可,您能够修改的部分,可能仅限于目标网址那个地方,也就是小编标红的区域,此处替换为您下载的echarts示例网页的地址即可(本地或者远端均可)。
CoInitialize(NULL);
HWND hWnd = this->m_hWnd;
CreateCoreWebView2EnvironmentWithOptions(nullptr, nullptr, nullptr,
Callback
(
[hWnd](HRESULT result, ICoreWebView2Environment* env) -> HRESULT
{
env->CreateCoreWebView2Controller(hWnd, Callback
(
[hWnd](HRESULT result, ICoreWebView2Controller* controller) -> HRESULT {
if (controller != nullptr) {
webviewController = controller;
webviewController->get_CoreWebView2(&webview);
}
wil::com_ptr
settings;
webview->get_Settings(&settings);
settings->put_IsScriptEnabled(TRUE);
settings->put_AreDefaultScriptDialogsEnabled(TRUE);
settings->put_IsWebMessageEnabled(TRUE);
RECT bounds;
::GetClientRect(hWnd, &bounds);
webviewController->put_Bounds(bounds);
Microsoft::WRL::ComPtr
settings2;
webview->get_Settings(&settings2);
settings2->put_IsScriptEnabled(TRUE);
CString strHtmlFilePath = _T("");
strHtmlFilePath = GetProgramFolder();
strHtmlFilePath += _T("//flsdmap.html");
int len = MultiByteToWideChar(CP_ACP, 0, strHtmlFilePath, -1, NULL, 0); // 计算所需长度
std::wstring wstr(len, 0);
MultiByteToWideChar(CP_ACP, 0, strHtmlFilePath, -1, &wstr[0], len); // 转换
LPCWSTR lpwstr = wstr.c_str(); // 获取 LPCWSTR
webview->Navigate(lpwstr);
EventRegistrationToken token;
webview->add_NavigationStarting(Callback
(
[](ICoreWebView2* webview, ICoreWebView2NavigationStartingEventArgs* args) -> HRESULT {
wil::unique_cotaskmem_string uri;
args->get_Uri(&uri);
std::wstring source(uri.get());
return S_OK;
}).Get(), &token);
webview->AddScriptToExecuteOnDocumentCreated(L"Object.freeze(Object);", nullptr);
webview->ExecuteScript(L"window.document.URL;", Callback
(
[](HRESULT errorCode, LPCWSTR resultObjectAsJson) -> HRESULT {
LPCWSTR URL = resultObjectAsJson;
//doSomethingWithURL(URL);
return S_OK;
}).Get());
webview->add_WebMessageReceived(Callback
(
[](ICoreWebView2* webview, ICoreWebView2WebMessageReceivedEventArgs* args) -> HRESULT {
wil::unique_cotaskmem_string message;
args->TryGetWebMessageAsString(&message);
webview->PostWebMessageAsString(message.get());
return S_OK;
}).Get(), &token);
return S_OK;
}).Get());