在MFC項目中使用Google Earth COM API示例

這是「在.NET平臺使用GE COM API示例」的衍生版本,這裏將介紹如何在MFC中使用.編輯器

以MFC對話框程序爲例說明,最終效果以下函數


下面逐步介紹this

一、首先新建一個給予對話框的MFC應用程序spa



二、接下來修改部分元素.net

生成項目以後,將對話框上的靜態文字控件刪除,3d

修改OK(肯定)和Cancel(取消)按鈕(選中控件打開屬性對話框)以下:code

左:【肯定】按鈕原始ID爲IDOK,修改成ID_StartGE       對象

右:【取消】按鈕IDCANCEL —> ID_StopGEblog

   

三、添加消息響應事件

而後分別添加這兩個按鈕的單擊事件響應(在資源編輯器界面雙擊該按鈕便可),

具體稍後再完善函數代碼

而後添加對話框的WM_CLOSE消息響應

(選中對話框打開屬性窗口,切換到【事件】標籤而後添加):



稍後再完善代碼

四、添加GE代碼

而後添加兩個文件GoogleEarth.h和GoogleEarth.cpp

方法一:新建源代碼文件而後完善代碼

方法二:將這兩個源代碼文件拷貝到項目中(添加到項目,以下圖)


選擇這兩個文件並添加


五、添加GE CLSID
    接下來,在StdAfx.h文件中添加


另外注意,請確保在GoogleEarth.cpp中已添加標準頭文件(#include "stdafx.h")

而後就能夠開始正式行動了。

六、COM初始化與退出

在App類(假設你的項目爲GEDemoMFC,那麼默認的類名CGEDemoMFCApp)中重寫兩個函數


在InitInstance()函數中添加 ::CoInitalize(NULL)


在ExitInstance()中添加::CoUninitialize()



其中CoInitialize是爲了能夠建立GE COM對象以便使用

七、添加GE變量及函數

首先,在Dialog類(CGEDemoMFCDlg)的頭文件中添加


添加IApplicationGE,GE Hwnd變量及輔助函數SetGEWindow():


八、編寫實現代碼

轉到實現文件,完善各個部分的代碼




其餘就不截圖了,參看代碼


在對話框類(CGEDemoMFCDlg)中完善代碼

初始化OnInitDialog函數

BOOL CGEDemoMFCDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// ...
	// TODO:  在此添加額外的初始化代碼
	GEApp = NULL;
	GEHMainWnd = NULL;
	GEHRenderWnd = NULL;

	return TRUE;  
}

按鈕StartGE單擊事件響應

void CGEDemoMFCDlg::OnBnClickedStartGE()
{
	// TODO:  在此添加控件通知處理程序代碼
	if (GEApp != NULL)
	{
		MessageBox(TEXT("Google Erath已經在運行!"));
	}
	else
	{
		GEApp.CreateDispatch(CLSID_GEAPP);
		GEHMainWnd = (HWND)GEApp.GetMainHwnd();
		GEHRenderWnd = (HWND)GEApp.GetRenderHwnd();
		SetGEWindow();
	}
}
按鈕StopGE單擊事件響應

void CGEDemoMFCDlg::OnBnClickedStopGE()
{
	// TODO:  在此添加控件通知處理程序代碼
	if (GEApp == NULL)
	{
		MessageBox(TEXT("Google Erath還沒有啓動!"));
	}
	else
	{
		::SendMessage(GEHMainWnd, WM_CLOSE, 0, 0);
		GEApp.ReleaseDispatch();
		GEApp = NULL;
	}
}
關閉窗口WM_CLOSE消息響應
void CGEDemoMFCDlg::OnClose()
{
	// TODO:  在此添加消息處理程序代碼和/或調用默認值
	if (GEApp != NULL)
	{
		::SendMessage(GEHMainWnd, WM_CLOSE, 0, 0);
		GEApp.ReleaseDispatch();
	}

	CDialog::OnClose();
}
SetGEWindow函數
void CGEDemoMFCDlg::SetGEWindow()
{
	// 隱藏GE主窗口
	::SetWindowPos(GEHMainWnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE|SWP_HIDEWINDOW);

	//設置GE影像窗口
	CRect rect;
	GetClientRect(rect);
	::MoveWindow(GEHRenderWnd, rect.left, rect.top, rect.Width(), rect.Height()-60,TRUE);
	::SetParent(GEHRenderWnd, this->m_hWnd);
}


在CGEDemoMFCApp類中添加以下代碼

InitInstance函數

BOOL CGEDemoMFCApp::InitInstance()
{
	CWinApp::InitInstance();
	::CoInitialize(NULL);
	// ...
	return FALSE;
}
ExitInstance函數
BOOL CGEDemoMFCApp::ExitInstance()
{
	::CoUninitialize();
	return CWinApp::ExitInstance();
}


在StdAfx.h中添加Google IApplication ClassID

// Google Earth CLSID
static const CLSID CLSID_GEAPP = 
	{ 0x8097D7E9, 0xDB9E, 0x4AEF, 
	  { 0x9B, 0x28, 0x61, 0xD8, 0x2A, 0x1D, 0xF7, 0x84 } };


啓動以後以下圖


點擊「啓動GE」就能看到本文開頭那張截圖的效果了。


最後附上GoogleEarth.h和GoogleEarth.cpp的下載連接


點此領取樓主 (ORhttp://blog.csdn.net/fengyhack/article/details/38685157)

相關文章
相關標籤/搜索