继《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: }2、NativeMethods类定义:
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、执行效果: