MFC與第三方類庫CWebPage開發javascript函數調用示例

    今天思索一個問題,想着怎麼用c++調用百度地圖,結果網上有一篇文章介紹瞭如何使用MFC項目結合CWebPage來調用百度地圖。看了整篇博客,思路很清晰,但是看下來,其實就是利用了MFC調用html頁面的javascript函數來達到調用百度地圖的目的。本質上還是web應用的地圖。不是真正意義上的從無到有加載百度地圖。自己通篇搞下來,也算是積累了一些經驗。我認爲這個是一個MFC調用html頁面的javascript函數的應用。下面介紹如何一步一步實現MFC調用html頁面的javascript函數。

    這裏準備工作:   

  1.     你需要安裝VC++6.0。
  2.    會一點javascript書寫技巧。
  3.    知道如何使用百度地圖api。
  4.    知道如何使用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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章