// CWebView.cpp : implementation file // #include "pch.h" #include "AppWebView.h" #include "CWebView.h" #include "Resource.h" #include #pragma comment(lib, "shlwapi.lib") // CWebView IMPLEMENT_DYNCREATE(CWebView, CView) CWebView::CWebView() { #ifndef _WIN32_WCE EnableActiveAccessibility(); #endif EnableAutomation(); } CWebView::~CWebView() { // Release WebView2 resources if (m_webViewController != nullptr) { m_webViewController->Close(); } } void CWebView::OnFinalRelease() { // When the last reference for an automation object is released // OnFinalRelease is called. The base class will automatically // deletes the object. Add additional cleanup required for your // object before calling the base class. CView::OnFinalRelease(); } BEGIN_MESSAGE_MAP(CWebView, CView) ON_WM_SIZE() END_MESSAGE_MAP() BEGIN_DISPATCH_MAP(CWebView, CView) END_DISPATCH_MAP() // Note: we add support for IID_IWebView to support typesafe binding // from VBA. This IID must match the GUID that is attached to the // dispinterface in the .IDL file. // {dfd2796c-8e59-4751-8330-d8c1ee525b0c} static const IID IID_IWebView = {0xdfd2796c,0x8e59,0x4751,{0x83,0x30,0xd8,0xc1,0xee,0x52,0x5b,0x0c}}; BEGIN_INTERFACE_MAP(CWebView, CView) INTERFACE_PART(CWebView, IID_IWebView, Dispatch) END_INTERFACE_MAP() // CWebView drawing void CWebView::OnDraw(CDC* pDC) { CDocument* pDoc = GetDocument(); // WebView2 handles its own drawing } void CWebView::OnInitialUpdate() { CView::OnInitialUpdate(); // Initialize WebView2 if (InitializeWebView()) { // Load HTML from resource LoadHTMLFromResource(IDR_HTML_HELLOWORLD); } } BOOL CWebView::InitializeWebView() { // Get the current module path for data folder TCHAR modulePath[MAX_PATH]; GetModuleFileName(NULL, modulePath, MAX_PATH); PathRemoveFileSpec(modulePath); // Create a temp folder for WebView2 user data CString userDataFolder; userDataFolder.Format(_T("%s\\WebView2Data"), modulePath); // Create WebView2 Environment HRESULT hr = ::CreateCoreWebView2EnvironmentWithOptions( nullptr, // Use default Edge installation CT2W(userDataFolder), // User data folder nullptr, // Use default environment options Microsoft::WRL::Callback( [this](HRESULT result, ICoreWebView2Environment* env) -> HRESULT { // Store the environment m_webViewEnvironment = env; // Create WebView controller return env->CreateCoreWebView2Controller(GetSafeHwnd(), Microsoft::WRL::Callback( [this](HRESULT result, ICoreWebView2Controller* controller) -> HRESULT { if (controller != nullptr) { m_webViewController = controller; m_webViewController->get_CoreWebView2(&m_webView); // Resize WebView to fit the window ResizeWebView(); } return S_OK; }).Get()); }).Get()); return SUCCEEDED(hr); } void CWebView::ResizeWebView() { if (m_webViewController != nullptr) { RECT bounds; GetClientRect(&bounds); m_webViewController->put_Bounds(bounds); } } void CWebView::OnSize(UINT nType, int cx, int cy) { CView::OnSize(nType, cx, cy); ResizeWebView(); } void CWebView::LoadHTMLFromResource(UINT resourceID) { if (m_webView == nullptr) return; // Find the HTML resource HRSRC hrsrc = ::FindResource(AfxGetResourceHandle(), MAKEINTRESOURCE(resourceID), _T("HTML")); if (hrsrc) { // Load the resource HGLOBAL hRes = ::LoadResource(AfxGetResourceHandle(), hrsrc); if (hRes) { // Lock the resource and get a pointer to it LPVOID lpRes = ::LockResource(hRes); if (lpRes) { // Get the size of the resource DWORD dwSize = ::SizeofResource(AfxGetResourceHandle(), hrsrc); if (dwSize > 0) { // Create a temporary file to store the HTML content TCHAR tempPath[MAX_PATH]; TCHAR tempFileName[MAX_PATH]; ::GetTempPath(MAX_PATH, tempPath); ::GetTempFileName(tempPath, _T("html"), 0, tempFileName); // Write the HTML content to the temporary file CFile file; if (file.Open(tempFileName, CFile::modeCreate | CFile::modeWrite)) { file.Write(lpRes, dwSize); file.Close(); // Convert the file path to a URL CString fileURL; fileURL.Format(_T("file:///%s"), tempFileName); fileURL.Replace(_T('\\'), _T('/')); // Navigate to the temporary file m_webView->Navigate(CStringW(fileURL)); } } } } } } // CWebView diagnostics #ifdef _DEBUG void CWebView::AssertValid() const { CView::AssertValid(); } #ifndef _WIN32_WCE void CWebView::Dump(CDumpContext& dc) const { CView::Dump(dc); } #endif #endif //_DEBUG // CWebView message handlers