C#基于google earth的二次开发
2011-06-28 06:55
288 查看
首先在C#中新建windows 应用程序。然后再form1中新建panel控件。命名为pnlEarth。
然后双击form1,进入form1.cs.
1、以下是代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using EARTHLib;
using System.Runtime.InteropServices;
using HookAPI;
using System.Threading;
namespace MYGPS3
{
public partial class Form1 : Form
{
private IntPtr _GEHrender;
private IntPtr _GEParentHrender;
private IntPtr _GEMainHandler;
private IApplicationGE _googleEarth;
private System.Windows.Forms.Control _parentControl;
IntPtr mapPtr;
IntPtr mainPtr;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
SetGEHandlerToControl(pnlEarth, _googleEarth);
}
/// <summary>
/// 将GE的地图控件挂载到指定的控件中去
/// </summary>
/// <param name="parentControl">c#控件</param>
/// <param name="geApplication">ge应用程序</param>
public void SetGEHandlerToControl(System.Windows.Forms.Control parentControl, IApplicationGE geApplication)
{
this._parentControl = parentControl;
this._googleEarth = geApplication;
_googleEarth = new ApplicationGEClass();
//获取GE的主窗体句柄
this._GEMainHandler = (IntPtr)this._googleEarth.GetMainHwnd();
//将GE主窗体的高宽设置为0,隐藏掉GE主窗体
NativeMethods.SetWindowPos(this._GEMainHandler, NativeMethods.HWND_BOTTOM, 0, 0, 0, 0, NativeMethods.SWP_NOSIZE + NativeMethods.SWP_HIDEWINDOW);
//获取GE地图控件句柄
this._GEHrender = (IntPtr)_googleEarth.GetRenderHwnd();
//获取GE地图控件的父窗体句柄
this._GEParentHrender = NativeMethods.GetParent(this._GEHrender);
//将GE地图控件的父窗体设置为不可见
//(考虑到GE地图控件可能被其他程序截获,加上这一句以应万全)
NativeMethods.PostMessage((int)this._GEParentHrender, NativeMethods.WM_HIDE, 0, 0);
//设置GE地图控件的父窗体句柄为winform上的控件
NativeMethods.SetParent(this._GEHrender, parentControl.Handle);
}
public void ResizeGEControl()
{
if (this._parentControl != null)
{
//设置GE地图控件的大小等于父窗体大小
NativeMethods.MoveWindow(this._GEHrender, 0, 0, this._parentControl.Width, this._parentControl.Height, true);
}
}
/// <summary>
/// 释放GE句柄
/// </summary>
public void RealseGEHandler()
{
try
{
if (this._parentControl != null)
{
//将GE地图控件的句柄还原到GE主窗体上去
NativeMethods.SetParent(this._GEHrender, this._GEParentHrender);
//关闭GE主程序
NativeMethods.PostMessage(this._googleEarth.GetMainHwnd(), NativeMethods.WM_QUIT, 0, 0);
}
}
finally
{
//为防本程序的进程不能成功退出而导致GE出现问题,强制杀掉本程序的进程
System.Diagnostics.Process geProcess = System.Diagnostics.Process.GetCurrentProcess();
geProcess.Kill();
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
RealseGEHandler();
}
private void pnlEarth_SizeChanged(object sender, EventArgs e)
{
ResizeGEControl();
}
}
}
2、然后新建类,进入类向导,命名为NativeMethods.cs
添加以下代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Drawing;
namespace MYGPS3
{
class NativeMethods
{
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, UInt32 uflags);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr PostMessage(int hWnd, int msg, int wParam, int lParam);
public delegate int EnumWindowsProc(IntPtr hwnd, int lParam);
[DllImport("user32", CharSet = CharSet.Auto)]
public extern static IntPtr GetParent(IntPtr hWnd);
[DllImport("user32", CharSet = CharSet.Auto)]
public extern static bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);
[DllImport("user32", CharSet = CharSet.Auto)]
public extern static IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
[DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
public static extern IntPtr GetWindow(IntPtr hWnd, int uCmd);
[DllImport("user32")]
public static extern IntPtr WindowFromPoint(Point point);//根据鼠标指针所在位置,得到窗口句柄
#region 预定义
public static readonly IntPtr HWND_BOTTOM = new IntPtr(1);
public static readonly IntPtr HWND_NOTOPMOST = new IntPtr(-2);
public static readonly IntPtr HWND_TOP = new IntPtr(0);
public static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
public static readonly UInt32 SWP_NOSIZE = 1;
public static readonly UInt32 SWP_NOMOVE = 2;
public static readonly UInt32 SWP_NOZORDER = 4;
public static readonly UInt32 SWP_NOREDRAW = 8;
public static readonly UInt32 SWP_NOACTIVATE = 16;
public static readonly UInt32 SWP_FRAMECHANGED = 32;
public static readonly UInt32 SWP_SHOWWINDOW = 64;
public static readonly UInt32 SWP_HIDEWINDOW = 128;
public static readonly UInt32 SWP_NOCOPYBITS = 256;
public static readonly UInt32 SWP_NOOWNERZORDER = 512;
public static readonly UInt32 SWP_NOSENDCHANGING = 1024;
#endregion
public static int GW_CHILD = 5;
public static int GW_HWNDNEXT = 2;
public static readonly Int32 WM_QUIT = 0x0012;
public static readonly Int32 WM_HIDE = 0x0;
}
}
3、添加google earthapi接口
在菜单栏中选择项目->添加引用->COM,然后选择Google Earth 1.0 Type Library.
之后生成即可实现将google earth内嵌到panel控件中,进行二次开发。
然后双击form1,进入form1.cs.
1、以下是代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using EARTHLib;
using System.Runtime.InteropServices;
using HookAPI;
using System.Threading;
namespace MYGPS3
{
public partial class Form1 : Form
{
private IntPtr _GEHrender;
private IntPtr _GEParentHrender;
private IntPtr _GEMainHandler;
private IApplicationGE _googleEarth;
private System.Windows.Forms.Control _parentControl;
IntPtr mapPtr;
IntPtr mainPtr;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
SetGEHandlerToControl(pnlEarth, _googleEarth);
}
/// <summary>
/// 将GE的地图控件挂载到指定的控件中去
/// </summary>
/// <param name="parentControl">c#控件</param>
/// <param name="geApplication">ge应用程序</param>
public void SetGEHandlerToControl(System.Windows.Forms.Control parentControl, IApplicationGE geApplication)
{
this._parentControl = parentControl;
this._googleEarth = geApplication;
_googleEarth = new ApplicationGEClass();
//获取GE的主窗体句柄
this._GEMainHandler = (IntPtr)this._googleEarth.GetMainHwnd();
//将GE主窗体的高宽设置为0,隐藏掉GE主窗体
NativeMethods.SetWindowPos(this._GEMainHandler, NativeMethods.HWND_BOTTOM, 0, 0, 0, 0, NativeMethods.SWP_NOSIZE + NativeMethods.SWP_HIDEWINDOW);
//获取GE地图控件句柄
this._GEHrender = (IntPtr)_googleEarth.GetRenderHwnd();
//获取GE地图控件的父窗体句柄
this._GEParentHrender = NativeMethods.GetParent(this._GEHrender);
//将GE地图控件的父窗体设置为不可见
//(考虑到GE地图控件可能被其他程序截获,加上这一句以应万全)
NativeMethods.PostMessage((int)this._GEParentHrender, NativeMethods.WM_HIDE, 0, 0);
//设置GE地图控件的父窗体句柄为winform上的控件
NativeMethods.SetParent(this._GEHrender, parentControl.Handle);
}
public void ResizeGEControl()
{
if (this._parentControl != null)
{
//设置GE地图控件的大小等于父窗体大小
NativeMethods.MoveWindow(this._GEHrender, 0, 0, this._parentControl.Width, this._parentControl.Height, true);
}
}
/// <summary>
/// 释放GE句柄
/// </summary>
public void RealseGEHandler()
{
try
{
if (this._parentControl != null)
{
//将GE地图控件的句柄还原到GE主窗体上去
NativeMethods.SetParent(this._GEHrender, this._GEParentHrender);
//关闭GE主程序
NativeMethods.PostMessage(this._googleEarth.GetMainHwnd(), NativeMethods.WM_QUIT, 0, 0);
}
}
finally
{
//为防本程序的进程不能成功退出而导致GE出现问题,强制杀掉本程序的进程
System.Diagnostics.Process geProcess = System.Diagnostics.Process.GetCurrentProcess();
geProcess.Kill();
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
RealseGEHandler();
}
private void pnlEarth_SizeChanged(object sender, EventArgs e)
{
ResizeGEControl();
}
}
}
2、然后新建类,进入类向导,命名为NativeMethods.cs
添加以下代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Drawing;
namespace MYGPS3
{
class NativeMethods
{
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, UInt32 uflags);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr PostMessage(int hWnd, int msg, int wParam, int lParam);
public delegate int EnumWindowsProc(IntPtr hwnd, int lParam);
[DllImport("user32", CharSet = CharSet.Auto)]
public extern static IntPtr GetParent(IntPtr hWnd);
[DllImport("user32", CharSet = CharSet.Auto)]
public extern static bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);
[DllImport("user32", CharSet = CharSet.Auto)]
public extern static IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
[DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
public static extern IntPtr GetWindow(IntPtr hWnd, int uCmd);
[DllImport("user32")]
public static extern IntPtr WindowFromPoint(Point point);//根据鼠标指针所在位置,得到窗口句柄
#region 预定义
public static readonly IntPtr HWND_BOTTOM = new IntPtr(1);
public static readonly IntPtr HWND_NOTOPMOST = new IntPtr(-2);
public static readonly IntPtr HWND_TOP = new IntPtr(0);
public static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
public static readonly UInt32 SWP_NOSIZE = 1;
public static readonly UInt32 SWP_NOMOVE = 2;
public static readonly UInt32 SWP_NOZORDER = 4;
public static readonly UInt32 SWP_NOREDRAW = 8;
public static readonly UInt32 SWP_NOACTIVATE = 16;
public static readonly UInt32 SWP_FRAMECHANGED = 32;
public static readonly UInt32 SWP_SHOWWINDOW = 64;
public static readonly UInt32 SWP_HIDEWINDOW = 128;
public static readonly UInt32 SWP_NOCOPYBITS = 256;
public static readonly UInt32 SWP_NOOWNERZORDER = 512;
public static readonly UInt32 SWP_NOSENDCHANGING = 1024;
#endregion
public static int GW_CHILD = 5;
public static int GW_HWNDNEXT = 2;
public static readonly Int32 WM_QUIT = 0x0012;
public static readonly Int32 WM_HIDE = 0x0;
}
}
3、添加google earthapi接口
在菜单栏中选择项目->添加引用->COM,然后选择Google Earth 1.0 Type Library.
之后生成即可实现将google earth内嵌到panel控件中,进行二次开发。
相关文章推荐
- Microstation Addins二次开发笔记(基于VS2008、C#)_1
- C#版OPOS打印(基于北洋OPOS SDK二次开发包,支持EPSON和北洋、佳博、商祺等支持标准ESC/POS指令的POS打印机)
- C#版OPOS打印(基于北洋OPOS SDK二次开发包,支持EPSON和北洋、佳博、商祺等支持标准ESC/POS指令的POS打印机)
- C#版OPOS打印(基于北洋OPOS SDK二次开发包,支持EPSON和北洋、佳博、商祺等支持标准ESC/POS指令的POS打印机)
- 基于GSM MODEM短信猫二次开发说明和免费二次开发包提供C#、VC、Delphi、linx、JAVA、PB等语言源程序
- C#版OPOS打印(基于北洋OPOS SDK二次开发包,支持EPSON和北洋、佳博、商祺等支持标准ESC/POS指令的POS打印机)
- 基于ArcGIS Engine+C#的二次开发---电子校园管理信息系统(1)
- C#版OPOS打印(基于北洋OPOS SDK二次开发包,支持EPSON和北洋、佳博、商祺等支持标准ESC/POS指令的POS打印机)
- 基于ArcGIS Engine+C#的二次开发---电子校园管理信息系统(2)
- ArcGIS基于C#.NET的二次开发
- 基于TCL_TK的HyperMesh二次开发
- 基于ArcGIS10.0和Oracle10g的空间数据管理平台三(C#开发)-多皮肤主界面功能
- 企业Unix Shell行为审计系统——基于Enterprise Audit Shell(EAS)的二次开发
- 基于ArcGIS10.0和Oracle10g的空间数据管理平台四(C#开发)-通用数据管理模块
- 基于leveldb,levigo做二次开发
- vs2010 solidworks2015 c# add-in模板 二次开发
- 基于C#开发 Windows Embedded Compact 7 应用
- C#开发微信门户及应用(41)--基于微信开放平台的扫码登录处理
- 基于C#的Skyline二次开发【2】
- 基于ArcGIS10.0和Oracle10g的空间数据管理平台(C#开发)-项目中专业名称介绍