继《C#调用GoogleEarth Com API开发(一)》,我Neil又带给大家第二篇文章。这一篇文章在第一篇的基础上,展示如何调用Windows API将GoogleEarth的界面隐藏掉,并将GoogleEarth的地图显示在自定义的窗体上。废话少说,直接上代码。 1、主窗口代码: 1: // 功能:GE实例(二) 2: // 描述:GE COM API 网址:http://earth.google.com/comapi/index.html 3: // 作者:温伟鹏 4: // 日期:2009-02-08 5: 6: using System; 7: using System.Collections.Generic; 8: using System.ComponentModel; 9: using System.Data; 10: using System.Drawing; 11: using System.Text; 12: using System.Windows.Forms; 13: using EARTHLib; 14: 15: namespace GEDemo 16: { 17: public partial class Form2 : Form 18: { 19: /// <summary> 20: /// 用来关闭GoogleEarth的消息定义 21: /// </summary> 22: static readonly Int32 WM_QUIT = 0x0012; 23: 24: private IntPtr GEHWnd = (IntPtr)5; 25: private IntPtr GEHrender = (IntPtr)5; 26: private IntPtr GEParentHrender = (IntPtr)5; 27: /// <summary> 28: /// 定义GE应用程序类 29: /// </summary> 30: private ApplicationGEClass GeApp; 31: 32: public Form2() 33: { 34: InitializeComponent(); 35: } 36: 37: protected override void OnLoad(EventArgs e) 38: { 39: base.OnLoad(e); 40: 41: if (!this.DesignMode) 42: { 43: GeApp = new ApplicationGEClass(); 44: 45: GEHWnd = (IntPtr)GeApp.GetMainHwnd(); 46: 47: NativeMethods.SetWindowPos(GEHWnd, NativeMethods.HWND_BOTTOM, 0, 0, 0, 0, 48: NativeMethods.SWP_NOSIZE + NativeMethods.SWP_HIDEWINDOW); 49: 50: GEHrender = (IntPtr)GeApp.GetRenderHwnd(); 51: GEParentHrender = (IntPtr)NativeMethods.GetParent(GEHrender); 52: 53: NativeMethods.MoveWindow(GEHrender, 0, 0, this.Width, this.Height, true); 54: 55: NativeMethods.SetParent(GEHrender, this.Handle); 56: } 57: } 58: 59: protected override void OnClosing(CancelEventArgs e) 60: { 61: base.OnClosing(e); 62: 63: NativeMethods.PostMessage(GeApp.GetMainHwnd(), WM_QUIT, 0, 0); 64: } 65: } 66: } 1: // 功能:Windows API调用 2: // 描述:大家可以参照MSDN 3: // 作者:温伟鹏 4: // 日期:2009-02-08 5: 6: using System; 7: using System.Collections.Generic; 8: using System.Text; 9: using System.Runtime.InteropServices; 10: 11: namespace GEDemo 12: { 13: public class NativeMethods 14: { 15: [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 16: public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, UInt32 uflags); 17: 18: [DllImport("user32.dll", CharSet = CharSet.Auto)] 19: public static extern IntPtr PostMessage(int hWnd, int msg, int wParam, int lParam); 20: 21: #region 预定义 22: 23: public static readonly IntPtr HWND_BOTTOM = new IntPtr(1); 24: public static readonly IntPtr HWND_NOTOPMOST = new IntPtr(-2); 25: public static readonly IntPtr HWND_TOP = new IntPtr(0); 26: public static readonly IntPtr HWND_TOPMOST = new IntPtr(-1); 27: public static readonly UInt32 SWP_NOSIZE = 1; 28: public static readonly UInt32 SWP_NOMOVE = 2; 29: public static readonly UInt32 SWP_NOZORDER = 4; 30: public static readonly UInt32 SWP_NOREDRAW = 8; 31: public static readonly UInt32 SWP_NOACTIVATE = 16; 32: public static readonly UInt32 SWP_FRAMECHANGED = 32; 33: public static readonly UInt32 SWP_SHOWWINDOW = 64; 34: public static readonly UInt32 SWP_HIDEWINDOW = 128; 35: public static readonly UInt32 SWP_NOCOPYBITS = 256; 36: public static readonly UInt32 SWP_NOOWNERZORDER = 512; 37: public static readonly UInt32 SWP_NOSENDCHANGING = 1024; 38: 39: #endregion 40: 41: public delegate int EnumWindowsProc(IntPtr hwnd, int lParam); 42: 43: [DllImport("user32", CharSet = CharSet.Auto)] 44: public extern static IntPtr GetParent(IntPtr hWnd); 45: 46: [DllImport("user32", CharSet = CharSet.Auto)] 47: public extern static bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint); 48: 49: [DllImport("user32", CharSet = CharSet.Auto)] 50: public extern static IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); 51: 52: [DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)] 53: public static extern IntPtr GetWindow(IntPtr hWnd, int uCmd); 54: 55: public static int GW_CHILD = 5; 56: public static int GW_HWNDNEXT = 2; 57: } 58: } 3、执行效果: