牛骨文教育服务平台(让学习变的简单)
博文笔记

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

创建时间:2014-08-19 投稿人: 浏览次数:519

这是“在.NET平台使用GE COM API示例”的衍生版本,这里将介绍如何在MFC中使用.

以MFC对话框程序为例说明,最终效果如下


下面逐步介绍

1、首先新建一个给予对话框的MFC应用程序



2、接下来修改部分元素

生成项目之后,将对话框上的静态文字控件删除,

修改OK(确定)和Cancel(取消)按钮(选中控件打开属性对话框)如下:

左:【确定】按钮原始ID为IDOK,修改为ID_StartGE       

右:【取消】按钮IDCANCEL —> ID_StopGE

   

3、添加消息响应

然后分别添加这两个按钮的单击事件响应(在资源编辑器界面双击该按钮即可),

具体稍后再完善函数代码

然后添加对话框的WM_CLOSE消息响应

(选中对话框打开属性窗口,切换到【事件】标签然后添加):



稍后再完善代码

4、添加GE代码

然后添加两个文件GoogleEarth.h和GoogleEarth.cpp

方法一:新建源代码文件然后完善代码

方法二:将这两个源代码文件拷贝到项目中(添加到项目,如下图)


选择这两个文件并添加


5、添加GE CLSID
    接下来,在StdAfx.h文件中添加


另外注意,请确保在GoogleEarth.cpp中已添加标准头文件(#include "stdafx.h")

然后就可以开始正式行动了。

6、COM初始化与退出

在App类(假设你的项目为GEDemoMFC,那么默认的类名CGEDemoMFCApp)中重写两个函数


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


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



其中CoInitialize是为了可以创建GE COM对象以便使用

7、添加GE变量及函数

首先,在Dialog类(CGEDemoMFCDlg)的头文件中添加


添加IApplicationGE,GE Hwnd变量及辅助函数SetGEWindow():


8、编写实现代码

转到实现文件,完善各个部分的代码




其他就不截图了,参看代码


在对话框类(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)


声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。