在MFC项目中使用Google Earth COM API示例
这是“在.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)
- 上一篇: 谷歌地球API开发者指南(高级)
- 下一篇: Google Earth 安装及查看