专栏名称: 信息时代的犯罪侦查
一切行为皆有犯罪的可能性,而在信息时代,这一过程变得更加复杂或者隐晦了。本号致力于传播打击和预防犯罪的手段、方法、理念,并希望能够推动侦查犯罪的机制变革,而这需要了解方方面面的信息。
目录
相关文章推荐
参考消息  ·  朔尔茨评价特朗普建议:“丑闻” ·  昨天  
参考消息  ·  福特CEO:这方面,中国领先美国10年 ·  2 天前  
GBA Community  ·  DeepSeek Confuses ... ·  2 天前  
GBA Community  ·  DeepSeek Confuses ... ·  2 天前  
中国日报网  ·  突发!塞尔维亚总统武契奇遇险 ·  2 天前  
参考消息  ·  韩国代总统指示:“动员所有力量” ·  2 天前  
51好读  ›  专栏  ›  信息时代的犯罪侦查

如何使用ECharts辅助开展数据可视化分析?

信息时代的犯罪侦查  · 公众号  ·  · 2024-10-04 17:11

正文


知识

案例

随笔

声音

其他


编者按

数据可视化的作用不容小觑,然而很多朋友或许并没有真正操刀体验的经历。


一、引言
在当今数据驱动的时代,数据可视化已成为分析的重要工具。ECharts作为一款强大的图表库,可以帮助开发者快速创建丰富的交互式图表,便于直观展示数据。本文将探讨如何在MFC中通过WebView2技术结合ECharts进行数据可视化分析,并详 细阐述数据的准备、处理和展示过程。
二、总体技术结构

在上述架构下,C++桌面端程序通过构造web网页和组织数据,实现借助ECharts展示数据的目的。首先,请大家看一下最终效果,如下图所示。在图示中,左边的两个表格,是我在应用程序中为组织数据提供的用户界面,右边部分是展示的“关联关系”图示。诚然,在这个架构下,如何显示图像,以及如何分析数据之间的关联关系,完全不用开发者费心。


在这个过程中,需要向大家讲明白四个技术点。我们一一道来。

三、几个主要的技术要点

1、在桌面端应用程序中访问web网页
在MFC桌面应用程序中,有很多种方法可以实现对web网页的访问和显示。最纷繁复杂的当属使用原始socket,这也是学习网络通信技术的底层基础,在应用层开发中几乎不太可能用到这种技术了。
第二种方法可以使用CHttpFile、CHttpConnectionj等封装好的类,优点是不“挑”浏览器类型,兼容性较好。缺点是无法实现对 使用新技术的web网页效果。
本案例中,小编使用了webview2技术。具体实现的细节如下:
(1)包含头文件:

#include

(2)使用WRL命名空间:

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());







请到「今天看啥」查看全文