今天思索一個問題,想着怎麼用c++調用百度地圖,結果網上有一篇文章介紹瞭如何使用MFC項目結合CWebPage來調用百度地圖。看了整篇博客,思路很清晰,但是看下來,其實就是利用了MFC調用html頁面的javascript函數來達到調用百度地圖的目的。本質上還是web應用的地圖。不是真正意義上的從無到有加載百度地圖。自己通篇搞下來,也算是積累了一些經驗。我認爲這個是一個MFC調用html頁面的javascript函數的應用。下面介紹如何一步一步實現MFC調用html頁面的javascript函數。
這裏準備工作:
- 你需要安裝VC++6.0。
- 會一點javascript書寫技巧。
- 知道如何使用百度地圖api。
- 知道如何使用MFC。
接下來進入正題,先創建一個html頁面,可以是外部的,也可以是項目裏面的,我這裏因爲使用了百度地圖,而且它需要開啓一個http服務,否則無法使用百度地圖的lbs服務。
準備html頁面
index.htm
<!doctype html>
<html>
<head>
<meta charset="UTF-8"/>
<title>map</title>
<style>
html,body{height:100%;width:100%;padding:0;margin:0;}
#root{height:100%;}
</style>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=3.0&ak=YcP5EukTHUoFR3oObxdfBHTfA3EUgHET"></script>
</head>
<body>
<div id="root"></div>
<script type="text/javascript">
window.onload = function(){
var map = new BMap.Map("root");
map.centerAndZoom(new BMap.Point(116.404,39.915),15)
map.enableScrollWheelZoom()
}
function getMessage(latitude,longitude){
return ("緯度:"+latitude+",經度:"+longitude);
}
</script>
</body>
</html>
這個頁面加載了百度地圖,我們另外編寫了一個getMessage()的函數,其實就是一個測試回調的函數,我們通過MFC結合CWebPage類可以調用就行了,這裏的功能很簡單,就是返回一個拼接的字符串。
進入html文件目錄下的命令行,通過python命令開啓一個http服務,這樣,在瀏覽器中我們可以通過輸入url的方式來訪問頁面。
瀏覽器訪問頁面:
以上是準備工作,下面進入MFC項目的創建以及加載頁面,調用頁面的javascript函數編碼工作。
創建MFC工程
創建工程,第一步選擇MFC AppWizard [exe],工程名稱隨便定義,我這裏是GeoDemo
第二步,選擇基於對話框的工程:
因爲後面需要在對話框中拉出一個瀏覽器控件,用來加載html頁面。創建成功就是這個樣子 :
接下來,我們需要修改界面。
接着在界面左側增加一個瀏覽器控件,用來加載html頁面,在界面右鍵,選擇Insert ActiveX Control:
選擇Microsoft Web Browser這個控件,點擊OK。
在頁面儘量拉寬一點,最後長這個樣子:
運行之後,長這樣子:
下面開始設置變量,增加處理函數,加載頁面,調用回調函數。具體做法是,在界面右鍵,選擇ClassWizard,選擇第二個tab頁面,對瀏覽器控件增加一個變量,會有警告:
我們根據提示,需要加入CWebBrowser2的頭文件和源文件,直接點擊“OK”按鈕:
接着,設置變量m_myweb:
我們對經度緯度編輯框也設置變量:
爲界面的“調用函數”按鈕控件增加響應,在按鈕控件上右鍵選擇Events,最後對“單擊”事件添加處理函數:
接下來,就是編寫代碼的時候了,前面主要是拖拽控件,以及設置變量,設置處理句柄。我們在編寫代碼之前,需要將第三方的CWebPage類庫的頭文件和源碼文件加入到項目中,我這裏直接給出來。有兩個文件:WebPage.h與WebPage.cpp。
我們先將他們放在項目路徑下:
接着在菜單欄Project->Add To Project->Files選擇項目路徑下的兩個文件:WebPage.h和WebPage.cpp,這兩個文件在文末也會給出地址,不用擔心上哪下載 。
我們在源文件GeoDemoDlg.cpp文件中編寫我們將要添加的代碼,我們需要引入WebPage.h。
#include "WebPage.h"
接着在OnInitDialog()方法中的最後return語句之前,增加一句代碼:
m_myweb.Navigate("http://127.0.0.1:8000/index.htm",NULL,NULL,NULL,NULL);
接着在我們的“回調函數 ”按鈕處理函數這裏(我這裏是OnCallback),書寫我們通過CWebPage類庫調用javascript函數的代碼:
void CGeoDemoDlg::OnCallback()
{
// TODO: Add your control notification handler code here
UpdateData(true);
CWebPage webpage;
webpage.SetDocument(m_myweb.GetDocument());
const CString functionName("getMessage");
CComVariant varResult;
webpage.CallJScript(functionName,m_latitude,m_longitude,&varResult);
//varResult.ChangeType(VT_BSTR);
CString msg;
msg = varResult.bstrVal;
MessageBox(msg);
}
解釋一下,我這裏是根據輸入的經緯度,傳給getMessage(m_latitude,m_longitude)函數 ,然後getMessage函數會返回拼接的字符串給MFC,這裏再將結果通過MessageBox顯示出來。達到了測試回調函數的目的。
第一次編譯運行,加載頁面會很慢,需要等待一段時間對話框中的頁面才加載出來。
以上代碼演示就完成了,最後給出代碼的github地址: https://github.com/buejee/GeoDemo