在现代软件开发中,将Web浏览器嵌入到桌面应用程序中是一种常见的需求。这不仅可以增强应用程序的功能,还可以提供更加丰富的用户体验。本文将介绍如何在MFC应用程序中嵌入Web浏览器,并展示如何使用WebBrowser控件加载和显示Google地图。
首先,需要创建一个MFC应用程序。打开VisualC++,按照以下步骤操作:
现在有了一个骨架应用程序。因为这个示例使用基于对话框的应用程序,所以在“对话框编辑器”中会出现一个带有“确定”和“取消”按钮的对话框。按照以下步骤向对话框中添加ActiveX控件:
当插入WebBrowser控件时,会自动分配一个控件标识符,但必须提供一个成员变量以访问该控件。要添加变量,请执行以下操作:
请阅读以获取需要的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*)¶m);
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);
最近,使用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);