在MFC应用程序中嵌入Web浏览器

在现代软件开发中,将Web浏览器嵌入到桌面应用程序中是一种常见的需求。这不仅可以增强应用程序的功能,还可以提供更加丰富的用户体验。本文将介绍如何在MFC应用程序中嵌入Web浏览器,并展示如何使用WebBrowser控件加载和显示Google地图

创建MFC应用程序

首先,需要创建一个MFC应用程序。打开VisualC++,按照以下步骤操作:

  1. 选择“文件”菜单中的“新建”选项。
  2. 选择“MFC AppWizard (EXE)”。
  3. 输入项目名称并选择位置。
  4. 点击“确定”。
  5. 在第一步对话框中,选择适合应用程序的应用程序类型——单文档、多文档或基于对话框。本例中选择“基于对话框”。
  6. 点击“下一步”。
  7. 选择应用程序特性和支持。第二步对话框要求选择应用程序需要的任何特性和支持——例如“关于”框或自动化支持。WebBrowser控件是一个ActiveX控件,因此选择ActiveX控件。点击“下一步”。
  8. 定义项目样式。第三步对话框用于定义项目。只有一个项目样式选项,即标准MFC。但可以指示IDE是否在源代码中生成注释,以及希望如何使用MFC库。默认选择适用于大多数应用程序。点击“下一步”。
  9. 命名文件和类。第四步对话框显示了VisualC++创建的所有文件和类的名称。可以将这些名称更改为更具描述性的名称或符合规范的名称。点击“完成”。

添加WebBrowser控件

现在有了一个骨架应用程序。因为这个示例使用基于对话框的应用程序,所以在“对话框编辑器”中会出现一个带有“确定”和“取消”按钮的对话框。按照以下步骤向对话框中添加ActiveX控件:

  1. 右键点击“对话框编辑器”。
  2. 从菜单中选择“插入ActiveX控件”。
  3. 选择“Microsoft Web Browser”。
  4. 点击“确定”。
  5. 在“对话框编辑器”中定位和调整WebBrowser控件的大小。
  6. 如果应用程序不需要默认的“确定”和“取消”按钮,请删除它们。

添加WebBrowser类和成员变量

当插入WebBrowser控件时,会自动分配一个控件标识符,但必须提供一个成员变量以访问该控件。要添加变量,请执行以下操作:

  1. 右键点击WebBrowser控件。
  2. 选择“ClassWizard”。
  3. 点击“成员变量”选项卡以显示控件标识符。
  4. 选择IDC_EXPLORER1。
  5. 点击“添加变量”,然后出现以下对话框:
  6. 点击“确定”以显示“确认类”对话框。
  7. 再次点击“确定”以向项目中添加CWebBrowser2类。
  8. 为控件变量输入一个名称。

获取Google Maps API

请阅读以获取需要的API密钥。

解决方案

首先定义一个全局变量:

CExplorer1 m_Browser;

经过一些研究,发现与Google Maps交互的最有效方式是通过WebBrowser控件,最好的方法是维护一个临时HTML文件,然后由WebBrowser控件打开。将在运行时使用这个HTML文件,因此使用以下代码分配其路径:

wchar_t FileName[2048]; GetCurrentDirectory(2048, FileName); wcscat(FileName, L"\\test.html");

第一个构建块是生成(或更新)此文件的函数。

void WriteHTML(const wchar_t* html) { IDispatch* pHtmlDoc = m_Browser.get_Document(); if (!pHtmlDoc) return; CComPtr<IHTMLDocument2> doc1 = NULL; doc1.Detach(); doc1.Attach((IHTMLDocument2*)pHtmlDoc); if (!doc1) return; // 创建一个新的一维数组 SAFEARRAY* psaStrings = SafeArrayCreateVector(VT_VARIANT, 0, 1); if (!psaStrings) return; BSTR bstr = SysAllocString(html); if (bstr) { VARIANT* param; HRESULT hr = SafeArrayAccessData(psaStrings, (LPVOID*)&param); if (SUCCEEDED(hr)) { param->vt = VT_BSTR; param->bstrVal = bstr; hr = SafeArrayUnaccessData(psaStrings); if (SUCCEEDED(hr)) { doc1->write(psaStrings); doc1->close(); } } } // SafeArrayDestroy调用SysFreeString释放每个BSTR! if (psaStrings) SafeArrayDestroy(psaStrings); }

假设已经定义了经度和纬度以及缩放级别(在示例中设置为“10”),并获取了API密钥,应该使用以下代码:

CoInitialize(NULL); m_Browser.put_Silent(TRUE); CString HTML_TEXT; CRect rect; CWnd *pWnd = GetDlgItem(IDC_SGWEBBROWSER); pWnd->GetWindowRect(▭); int w = rect.Width() - 50, h = rect.Height() - 50; HTML_TEXT.Format(L" ", w, h, Latitude, Longitude, Latitude, Longitude, API_KEY); FILE *fp = _wfopen(FileName, L"w"); fwprintf(fp, L"%s", HTML_TEXT.GetBuffer()); fclose(fp); m_Browser.Navigate(FileName, 0, 0, 0, 0);

Web浏览器兼容性问题

最近,使用WebBrowser控件与Google Maps等API进行接口变得越来越困难。阅读并按照其中的说明操作,当尝试在WebBrowser控件中显示Google地图时,会收到错误消息。

基本上,需要操作以下注册表键:

Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION

或者添加META标签:

<meta http-equiv="IE X-UA-Compatible" content="IE=edge">

显示地图

m_Browser.Navigate(FileName, 0, 0, 0, 0);
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485