C#基于google earth的二次开发

来源:互联网 发布:彩票开奖数据api 编辑:程序博客网 时间:2024/05/17 05:59

首先在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控件中,进行二次开发。

原创粉丝点击